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

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,获取自定义注解的对象
    • 通过注解的对象分别获取注解属性值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浏览器的一些功能

1.改主页面 点浏览器右上角的三个点也就是一个... 点了设置 你可以在这里改它的颜色 还有页面 一些有意思的网站: sandspiel像素风格游戏 趣味互动游戏&#xff1a;请画一个小人 (webhek.com)​​​​​​ 2018 - makemepulse解压游戏 Layered Water (vlucendo.com)水模…

《计算机网络微课堂》2-2 物理层下面的传输媒体

请大家注意&#xff0c;传输媒体不属于计算机网络体系结构的任何一层&#xff0c;如果非要将它添加到体系结构中&#xff0c;‍‍那只能将其放在物理层之下。 传输媒体可分为两类&#xff1a;一类是导引型传输媒体&#xff0c;‍‍另一类是非导引型传输媒体。 在导引型传输媒体…

测试网0撸大毛 — AI 公链ALIENX推出HAL Testnet活动(含保姆级教程)

近期&#xff0c;OpenAI推出了新一代的GPT-4o让AI再次获得关注。AI硬件销售商英伟达的股价也突破1000美元&#xff0c;市值攀升到2.6万亿美元。AI继续影响到我们生活的方方面面。 在加密货币行业&#xff0c;市场行情也逐渐走出低谷。以太坊现货ETF被批准&#xff0c;为整个市场…

小程序主体变更是通过迁移吗?是需要2个小程序吗?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…

一、Elasticsearch介绍与部署

目录 一、什么是Elasticsearch 二、安装Elasticsearch 三、配置es 四、启动es 1、下载安装elasticsearch的插件head 2、在浏览器&#xff0c;加载扩展程序 3、运行扩展程序 4、输入es地址就可以了 五、Elasticsearch 创建、查看、删除索引、创建、查看、修改、删除文档…

React 学习-10-ant design pro项目搭建

1.确保npm淘宝镜像为最新&#xff1a;npm config set registry https://registry.npmmirror.com 2.npm i ant-design/pro-cli -g 3.pro create my-app(确保git已安装&#xff0c;可远程拉代码) 4. 安装依赖&#xff0c;启动项目 npm run start

安卓玩机搞机技巧综合资源----自己手机制作证件照的几种方法 免费制作证件照

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

微信小程序源码-基于Java后端的会议发布与预约系统毕业设计(附源码+演示录像+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设…

从cuda到cudnn到pytorch

一、预配版本信息 1、cuda12.1.1 2、cudnn8.9.7 3、pytorch2.2.0 二、引用 深度学习之环境配置&#xff1a;【CUDA 12.1.1cuDNN 8.9.1】最新安装教程记录 -- 20240429_torch 1.12.0对应torchvision-CSDN博客 补充&#xff1a; cuda历史版本索引&#xff1a; NVIDIA Dev…

【C语言深度解剖】(15):动态内存管理和柔性数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

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

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

【竞技宝】英超:足总杯踢完解雇腾帅,曼联管理层心意已决

根据知名媒体《卫报》的报道,足总杯之后曼联将会 解雇滕哈格,哪怕他率领曼联队能够击败强大的曼城夺冠,也无法改变他将下课的事实。因为曼联本赛季的联赛排名只有第8名,已经来到了近30年来的最差成绩,这种情况下滕哈格与曼联的缘分似乎将被终结。 滕哈格上赛季成为曼联的主帅,由…

2024洗地机哪个牌子好?洗地机十大品牌

洗地机在不同家庭环境中都能发挥其独特的优势&#xff0c;无论是大面积的地板还是狭小的角落&#xff0c;都能轻松应对。 对于有孩子或宠物的家庭&#xff0c;地面上经常会有各种杂物和污渍&#xff0c;洗地机强大的吸力和深度清洁功能&#xff0c;可以迅速清理掉这些脏东西&a…

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

SpringCloud的Config配置中心&#xff0c;为什么要分Server服务端和Client客户端&#xff1f; 在SpringCloud的Config配置中心中分了Server服务端和Client客户端&#xff0c;为什么需要这样分呢&#xff1f;它的思想是所有微服务的配置文件都放到git远程服务器上&#xff0c;让…

Vue 导出 Excel

theme: smartblue 依赖下载 npm i exceljs file-saver 简单案例 Export 导出后的文件如下&#xff1a; 相关操作 合并单元格 worksheet.mergeCells(A1:B1) 添加边框 worksheet.getCell(A2).border { top:{style:thin}, left:{style:thin}, right:{style:thin}, bottom:{st…

9.1 Go语言入门(环境篇)

Go语言入门&#xff08;环境篇&#xff09; 目录一、什么是Go语言二、下载安装配置Go语言开发环境1. 下载2. 安装3. 配置环境变量4. 安装环境验证 三、 开发工具1. 下载2. 安装3. 激活4. 配置SDK 四、 创建go工程文件并运行1. 创建go工程2. 示例代码3. 运行代码 目录 一、什么…

amis-editor 低代码可视化编辑器开发 和 使用说明

1.amis-editor可视化编辑器 React版本&#xff08;推荐&#xff09;&#xff1a; GitHub - aisuda/amis-editor-demo: amis 可视化编辑器示例 https://aisuda.github.io/amis-editor-demo 建议使用react版本&#xff0c;好维护&#xff0c;升级版本更新package.json中对应版本…

Ollama:一个在本地部署、运行大型语言模型的工具

Ollama&#xff1a;一个在本地部署、运行大型语言模型的工具 Ollama部署、运行大型语言模型概述安装配置Ollama命令模型库使用示例自定义模型从GGUF导入自定义提示从PyTorch或Safetensors导入 开启服务REST API卸载Ollama One-API概述One-API管理本地模型 Open WebUI概述Docker…

RuntimeException 和 Exception区别 (比如事务管理中)

在 Spring 框架中&#xff0c;RuntimeException 和 Exception 的区别主要体现在异常处理和事务管理的方面。这两者都是 Java 异常处理体系的一部分&#xff0c;以下是它们在 Spring 中的区别&#xff1a; 异常处理&#xff1a; RuntimeException&#xff1a;在 Spring 中&…

IDEA打开项目报错

IDEA打开项目报错&#xff1a; Cannot read scheme C:\Users\xxxxxx\AppData\Roaming\JetBrains\IntelliJIdea2023.2\qaplug_profiles\Default.xmljava.lang.AbstractMethodError: Receiver class com.soldevelo.qaplug.scanner.AnalysisProfileManager$2 does not define or i…