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

news2024/12/22 23:28:55

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)
    

    例子:

        @Test
        public 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.coloradmin.cn/o/1693684.html

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

相关文章

IDEA 将多个微服务Springboot项目Application启动类添加到services标签,统一启动、关闭服务

IDEA 将多个微服务Springboot项目Application启动类添加到services标签&#xff0c;统一启动、关闭服务 首先在Views > Tool Windows > Services 添加services窗口 点击services窗口&#xff0c;首次需要添加配置类型&#xff0c;我们选择Springboot 默认按照运行状态分…

Apache Hive 安装与配置的详细教程

1. Hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能…

【QGIS入门实战精品教程】5.3:CGCS2000转Lambert投影

参考阅读: 【GlobalMapper精品教程】081:WGS84/CGCS2000转Lambert投影 文章目录 一、加载实验数据二、投影转换三、批量投影转换一、加载实验数据 加载配套实验数据,如下图所示:图层为长沙市范围、长沙市酒店宾馆分布点位、湖南省酒店分布点位矢量数据。 双击图层,打开信…

Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现

目录 一、用Springboot读取本地工作目录的文件和文件结构 1.1、需求介绍 1.2、后端传递数据 1.2.1、语言框架 1.2.2、本地工作目录示范 1.2.3、后端代码 ①controller层 ②service层 ③响应的数据 二、总结 一、用Springboot读取本地工作目录的文件和文件结构 1.1、…

5.23.12 计算机视觉的 Inception 架构

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

Spring框架学习笔记(四):手动实现 Spring 底层机制(初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP)

1 Spring 整体架构示意图 2 阶段 1 -- 编写自己的 Spring 容器&#xff0c;实现多层扫描包 编写自己的 Spring 容器&#xff0c;实现多层扫描包&#xff0c;排除包下不是bean的&#xff0c; 得到 bean 对象&#xff0c;放入到临时ioc容器中 代码实现&#xff1a; &#xff0…

闲鱼电商运营高级课程,一部手机学会闲鱼开店赚钱(34节课)

课程目录 1&#xff0c;闲鱼更货出售主要核心原理.mp4 2、闲鱼前期开店准备.mp4 3.账号基础信息设置1.mp4 4、提升账号权重.mp4 5、注意避免违规行为.mp4 6、实接课 应该怎么选择爆款产品.mp4 7、分析商品的闲鱼市场.mp4 8、寻找最低价货源.mp4 9、怎么寻我优质的货源…

把自己的垃圾代码发布到官方中央仓库

参考博客&#xff1a;将组件发布到maven中央仓库-CSDN博客 感谢这位博主。但是他的步骤有漏缺&#xff0c;相对进行补充 访问管理页面 网址&#xff1a;Maven Central 新注册账号&#xff0c;或者使用github快捷登录&#xff0c;建议使用github快捷登录 添加命名空间 注意&…

【会议征稿,IEEE出版】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024,6月28-30)

第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISCTT 2024&#xff09;将于2024年6月28-30日在中国绵阳举行。 ISCTT 2024将围绕 “信息科学”、"计算机技术”、“交通运输” 等最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专…

【idea】idea2024最新版本下载_安装_破解

1、下载 下载地址&#xff1a;下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 下载完成&#xff1a; idea破解脚本下载链接&#xff1a;https://pan.baidu.com/s/1L5qq26cRABw8XuEn_CngKQ 提取码&#xff1a;6666 下载完成&#xff1a; 2、安装 1、双击idea的安装包&…

MGR集群从库出现RECOVERING

一、MGR集群问题 说明&#xff1a; 1、启动MGR集群&#xff0c;发现从库转态是&#xff1a;RECOVERING&#xff0c;导致数据不同步。 2、查看MGR日志报错信息&#xff0c;发现提示从库以存在数据库linux&#xff0c;导致无法创建。 3、报错信息如下图所示&#xff1a; 二、解决…

数组-在两个长度相等的有序数组中找到上中位数

题目描述 解题思路 此题目直接遍历两个列表&#xff0c;时间复杂度为O(n)&#xff1b;使用二分法去比较两个递增列表的中位数&#xff0c;缩小两个数组中位数范围&#xff0c;时间复杂度O(logn)&#xff0c;这里我们的算法实现使用二分法。 通过举例子来说明解题算法&#xf…

git revert 和 git reset

文章目录 工作区 暂存区 本地仓库 远程仓库需求&#xff1a;已推送到远程仓库&#xff0c;想要撤销操作git revert &#xff08;添加新的提交来“反做”之前的更改&#xff0c;云端会残留上次的提交记录&#xff09;git reset&#xff08;相当于覆盖上次的提交&#xff09;1.--…

lvgl无法显示中文

环境&#xff1a; VS2019、LVGL8.3 问题&#xff1a; VS2019默认编码为GB2312&#xff0c; 解决&#xff1a; VS2022设置编码方式为utf-8的三种方式_vs utf8-CSDN博客 我用的方法2&#xff0c;设置为 utf-8无签名就行。

Java+Spring+ IDEA+MySQL云HIS系统源码 云HIS适合哪些地区的医院?

JavaSpring IDEAMySQL云HIS系统源码云HIS适合哪些地区的医院&#xff1f; 云HIS适合哪些地区的医院&#xff1f; 云HIS&#xff08;云医院信息系统&#xff09;适合多种地区的医院&#xff0c;特别是那些希望实现医疗服务的标准化、信息化和规范化&#xff0c;同时降低IT运营成…

二叉排序树的创建

二叉排序树就是节点经过排序构建起的二叉树&#xff0c;其有以下性质&#xff1a; 1. 若它的左子树不为空&#xff0c;则左子树上所有节点的值均小于它的根节点的值。 2. 若它的右子树不为空&#xff0c;则右子树上所有节点的值均大于它的根节点的值。 3. 它的左、右子树也分…

【评价类模型】层次分析法(AHP)

1.评价类思想综述&#xff1a; 明确评价主体–>评价指标确定–>计算指标权重–>方案评价 1.1指标确定&#xff1a; 可以通过一个思维导图的方式来画出一个指标系统&#xff0c;先确定方向&#xff0c;再向下细化 注意&#xff1a;指标需要具有贴合性和独立性。 贴合…

《计算机网络微课堂》1-5 计算机网络的性能指标

本节课我们介绍计算机网络的性能指标&#xff0c;性能指标可以从不同的方面来度量计算机网络的性能。 常用的计算机网络性能指标有 8 个&#xff1a;速率、带宽、吞吐量、时延、时延带宽积&#xff0c;往返时间、利用率&#xff0c;丢包率。 ‍ 速率 首先介绍速率。为了能够…

Vue3中为Ant Design Vue中table的checkbox加tooltip、popover

问题的产生 Vue版本&#xff1a;3.3.13 ant-design-vue 版本&#xff1a;3.x.x 在工作时遇到一个场景&#xff0c;需要在 ant-table 的 checkbox 被禁用的时候提示原因&#xff0c;但是在 ant-design-vue 文档中并没有发现有相关介绍。 首先我去看了issue中是否有提到相关问题…

[数据集][目标检测]抽烟喝酒检测数据集VOC+YOLO格式1026张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1026 标注数量(xml文件个数)&#xff1a;1026 标注数量(txt文件个数)&#xff1a;1026 标注…