动态代理,反射,注解的复习笔记

1.动态代理的作用

动态代理最主要的用途就是在各种框架中,很方便的在运行期间生成代理类,通过代理类就可以完成AOP、过滤器、拦截器等操作

(注:代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。比如UserService类有1000个业务方法,每个业务方法都都需要记录执行时间,那么不可能写1000次相同代码吧,因此可以让代理对象帮忙完成时间记录)
在这里插入图片描述
首先使用动态代理必须基于接口,动态代理的静态创建方法:

public static Object newProxyInstance(ClassLoader loader,/*对象.getClass().getClassLoader() ,目标对象通过getClass方法获取类的所有信息后,调用getClassLoader()方法来获取类加载器
获取类加载器后,可以通过这个类型的加载器,在程序运行时,将生成的代理类加载到JVM即Java虚拟机中,以便运行时需要*/Class<?>[] interfaces,/*对象.getClass().getInterfaces() 
获取被代理类的所有接口信息,以便于生成的代理类可以具有代理类接口中的所有方法*/InvocationHandler handle /*用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类方法的处理以及访问*/   ) 

java.lang.reflect.InvocationHandler是代理对象的实际处理代理逻辑的接口,具体代理逻辑在其 invoke 方法中实现

public Object invoke(Object proxy, Method method, Object[] args)
**解释说明:
- 返回值:方法被代理后执行的结果
- 参数列表说明:Object proxy   :  就是代理对象(通常不使用)Method method  :  代理对象调用的方法Object[] args  :  被代理方法中的参数 (因为参数个数不定,所以用一个对象数组来表示)如果方法不使用参数,则为 null//所有代理对象调用的方法,执行是都会经过invoke
//因此如果要对某个方法进行代理增强,就可以在这个invoke方法中进行定义    

例子:

/*其中Star是代理类接口,具有Song和Dance方法;*/
public class ProxyUtil {public static Star createProxy(BigStar bigStar){Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class}, new InvocationHandler() {@Override // 回调方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理对象要做的事情,会在这里写代码if(method.getName().equals("sing")){System.out.println("准备话筒,收钱20万");}else if(method.getName().equals("dance")){System.out.println("准备场地,收钱1000万");}return method.invoke(bigStar, args);}});return starProxy;}
}

2.线程池的几种状态

  • RUNNING : 表示正常运行,既可以接受新任务,也会正常处理阻塞队列的任务
  • SHUTDOWN : 当线程池调用shutdown()方法时,进入该状态,表示线程池处于关闭状态,不会接受新任务但是会处理队列中的任务
  • STOP : 调用线程池的shutdownnow()方法时,进入该状态,表示线程池处于停止状态,既不接受新任务也不处理队列任务,正常运行的线程也会被中断
  • TIDYING : 线程池没有线程运行时,状态自动变为TIDYING,并且调用terminated(),该方法是空方法,留给程序与扩展
  • TERMINATED : terminated()方法执行完成后,线程池就变成该状态

3.反射技术的作用,需要什么

  • 反射需要Class对象
  • 作用
    • 不使用new关键字去创建对象
    • 不使用“对象名.方法”的形式就可以调用方法
    • 不使用“对象名.属性”的形式就可以给属性赋值取值
    • 可以对私有成员变量进行操作

4.获取Class对象的方法

  • 类型名.Class
  • 对象名.getcClass
  • Class.forName(String className) //className是全路径类名 = 包名+类型名

5.反射创建对象的方法

  • 根据Class对象创建

    Class stuClass = Class.forName("com.cls.demo2.Student");Student stu = (Student) stuClass.newInstance();stu.study();
    
  • 获取构造器进行创建

     //获取Class对象(Student.class)
    Class stuClass = Student.class;//public Student(String name, int age, String gender)
    //获取带有参数的构造器对象
    //参数:是用来设置构造方法中参数的类型是什么
    Constructor con = stuClass.getConstructor(String.class, int.class, String.class);//实例化有参构造方法
    //参数:要传递给Student(String name, int age, String gender)的数据
    Student stu = (Student) con.newInstance("熊大", 22, "男");//调用对象中的方法
    stu.study();
    

6.获取成员方法 方法调用

  • 获取成员方法

    每一个成员方法都是一个Method类的对象,我们可以通过Method对象来调用成员方法

    Class类中的Method相关方法:

    Method[] getMethods();
    //获得当前类和其父类中的所有public成员方法对象,返回数组Method[] getDeclaredMethods();
    //获得当前类中的所有成员方法对象,返回数组
    //只获得本类的,包括public、protected、默认、private的Method getMethod(String name,Class...args);
    //根据方法名和参数类型获得对应的成员方法对象,只能获得public的
    //参数说明:
    name : 类中方法的名字
    args : 方法中参数类型的Class     例:int.class     Method getDeclaredMethod(String name,Class...args);
    //根据方法名和参数类型获得对应的成员方法对象,包括public、protected、(默认)、private的
    

    Method常用方法:

    //使用方法对象,调用对象中的方法执行(入栈执行)
    Object invoke(Object obj, Object... args) // 设置"暴力访问"  ——是否取消权限检查,true取消权限检查,false表示不取消    
    void setAccessible(true)
    

    例子:

        @Testpublic void testMethod2() throws ClassNotFoundException {//获取Class对象Class stuClass  = Class.forName("com.itheima.method.demo1.Student");//使用Class对象,获取Method对象Method[] methods = stuClass.getDeclaredMethods();//获取本类中所有方法(包含私有)for (Method m : methods){System.out.println(m);}}
    
  • 方法调用

反射调用对象的私有方法需要去除JVM权限检查

7.注解

  • 自定义注解

    public @interface 注解名{//内容熟悉:数据类型 属性名();数据类型 属性名() dalfult 默认值;
    }
    
  • 元注解

    定义在自定义注解上,@Target指定自定义注解修饰什么地方,@Retention指定自定义注解生命周期(有效范围)

    例子

    @Target({ElementType.METHOD,ElementType.TYPE}) //修饰类/接口 以及 方法
    public @inference stu{String name();
    }
    
  • 注解解析

    使用反射技术完成注解数据的解析

    步骤:

    • 利用反射获取相关对象:类,构造器,方法,属性
    • 利用方法getAnnotation,获取自定义注解的对象
    • 通过注解的对象分别获取注解属性值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02.爬虫---HTTP基本原理

02.HTTP基本原理 1.URI 和 URL 的区别2.HTTP 和 HTTPS 的区别3.请求过程 1.URI 和 URL 的区别 URL&#xff08;Uniform Resource Locator&#xff09;即-统一资源定位符 URL是用来定位和访问互联网上资源的独特标识&#xff0c;它包括了资源的位置&#xff08;如IP地址或域名&a…

移动硬盘难题:不显示容量与无法访问的解决策略

在使用移动硬盘的过程中&#xff0c;有时会遇到一些棘手的问题&#xff0c;比如移动硬盘不显示容量且无法访问。这种情况让人十分头疼&#xff0c;因为它不仅影响了数据的正常使用&#xff0c;还可能导致重要数据的丢失。接下来&#xff0c;我们就来详细探讨一下这个问题及其解…

CentOS 7安装/卸载Grafana

说明&#xff1a;本文介绍CentOS 7操作系统如何安装/卸载Grafana&#xff1b; 安装 Step1&#xff1a;下载rpm文件 敲下面的命令&#xff0c;下载grafana的rpm文件 wget https://dl.grafana.com/oss/release/grafana-7.3.7-1.x86_64.rpmStep2&#xff1a;安装grafana 敲下…

使用xxl-job-executor-go 接入xxl-job实现定时任务调度

定时任务是软件开发中很常见的一种处理业务的机制&#xff0c;xxl-job是近些年比较火的定时任务调用组件&#xff0c;其采用java 实现&#xff0c;是一个高可用&#xff0c;分布式调用的组件&#xff0c;还支持多种定时任务有关的特性&#xff0c;不仅能轻易的用java 客户端接入…

SpringBoot高级原理详解

今日内容&#xff1a; 理解SpringBoot自动化配置源码理解SpringBoot健康监控 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 目的&#xff1a;通过依赖能了解SpringBoot管理了哪些starter讲解&#xff1a; 通过依赖 spring-boot-dependencies 搜索 …

【C++】<知识点> 标准模板库STL(上)

文章目录 一、STL---string类 1. 常用构造函数 2. 常用操作 3. 字符串流处理 二、STL---容器 1. STL及基本概念 2. 顺序容器简介 3. 关联容器简介 4. 容器适配器简介 5. 常用成员函数 三、STL---迭代器 1. 普通迭代器 2. 双向、随机访问迭代器 3. 不同容器的迭代器…

数据结构:二叉树与树

一 树的基本概念&#xff1a; 1.树的形状&#xff1a; 2.树的定义&#xff1a; 树是一种非线性的数据结构&#xff0c;它是n(n > 0)个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 2.1 有且仅有一个特定的称为根的结点。 2.2 当n …

k8s二进制安装与部署

目录 一、实验目的 二、实验环境 三、实验步骤 3.1 操作系统初始化配置 3.2 部署 docker引擎 3.3 部署 etcd 集群 3.3.1 在 master01 节点上操作 ​3.3.2 在 node01 节点上操作 3.3.3 在 node02 节点上操作 3.4 部署 Master 组件 3.4.1 在 mast…

Softing工业推出新品edgeGate:一款用于工业边缘和云应用的硬件网关

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing工业自动化在2024年汉诺威工业博览会上首次展示了新品edgeGate。该产品是一个无需维护的硬件物联网网关解决方案&#xff0c;可将生产数据从PLC和数控机床控制器传输至工业边缘及物联网云平台。 &#xff08;edge…

MiniMax Golang2轮面试,期望薪资25K

一面 1、自我介绍 2、简单介绍一下你们成立了这个finance的财务中台之后&#xff0c;整体的服务架构是怎么样的吗&#xff1f; 3、就你提到的预算池项目&#xff0c;展开说说背景&#xff0c;以及解决了怎么样的问题&#xff1f; 4、为什么采用针对T-1订单的异步计算方案&a…

jmeter线程组(下篇)

线程组 线程组作为JMeter测试计划的核心组件之一&#xff0c;对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口&#xff0c;所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池&#xff0c;其中每个线程可被理解为一个虚拟用户&#x…

(Java面试题分享)万里长征-03-搜狐

万里长征-03-搜狐 ⚙ 以下内容基于GPT-4o模型 问题 1.LeetCode103 二叉树的锯齿形层序遍历 103. 二叉树的锯齿形层序遍历 - 力扣&#xff08;LeetCode&#xff09; 2.LeetCode5 最长回文子串 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 3.Kafka为何那么快 …

初学者都能掌握的操作符(中)

&#xff08;1&#xff09;位操作符&#xff08;& | ^&#xff09; &&#xff1a;&#xff08;按二进制位“与”&#xff09; 也就是两个数的每一位二进制数按照 “与” 的算法&#xff0c;如下&#xff1a; int a 3 ,b 5 ; c a & b; 我们首先写出a和b的二进…

5.23.12 计算机视觉的 Inception 架构

1. 介绍 分类性能的提升往往会转化为各种应用领域中显着的质量提升&#xff0c;深度卷积架构的架构改进可用于提高大多数其他计算机视觉任务的性能&#xff0c;这些任务越来越依赖于高质量的学习视觉特征。在 AlexNet 功能无法与手工设计、制作的解决方案竞争的情况下&#xf…

如何评价刘强东说“业绩不好的人不是我兄弟”

在近日的一次京东管理层会议上&#xff0c;创始人刘强东以不容置疑的口吻表明了对公司文化的坚定态度&#xff1a;“凡是长期业绩不好&#xff0c;从来不拼搏的人&#xff0c;不是我的兄弟。”这句话不仅是对那些工作表现不佳的员工的直接警告&#xff0c;也透露出京东在追求业…

three.js能实现啥效果?看过来,这里都是它的菜(08)

在Three.js中实现旋转动画的原理是通过修改对象的旋转属性来实现的&#xff0c;通常使用渲染循环&#xff08;render loop&#xff09;来更新对象的旋转状态&#xff0c;从而实现动画效果。 具体的原理包括以下几个步骤&#xff1a; 创建对象&#xff1a;首先创建一个需要旋转…

AIGC-风格迁移-style Injection in Diffusion-CVPR2024HighLight-论文精度

Style Injection in Diffusion: A Training-free Approach for Adapting Large-scale Diffusion Models for Style Transfer-CVPR2024HighLight 代码&#xff1a;https://github.com/jiwoogit/StyleID 论文&#xff1a;https://jiwoogit.github.io/StyleID_site/ 为了解决风格迁…

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

目录 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2与Vue3的onMounted对比 1.3、vue3中onMounted的用法 1.3.1、基础用法 1.3.2、顺序执行异步操作 1.3.3、并行执行多个异步操作 1.3.4、执行一次…

Rust腐蚀怎么用服务器一键开服联机教程

1、进入控制面板 首次登陆需要点击下方重置密码&#xff0c;如何再点击登录面板&#xff0c;点击后会跳转到登录页面&#xff0c;输入用户名和密码登录即可 2、设置游戏端口 由于腐蚀的设置需要三个端口&#xff0c;它们用于游戏端口&#xff08;必须为首选端口&#xff09;&a…

FFMPEG 解码过程初步学习

1. 视频文件解码过程 解码过程 步骤如下&#xff1a; 视频文件&#xff08;封装格式&#xff0c;MP4/FLV/AVI 等&#xff09;获取视频格式信息等解复用为Stream 流&#xff0c; 准备解码用的Codec将Stream 流 使用解码器解为Raw 格式针 1.1 音视频格式填充&#xff1a; int…