分析&回答
什么是反射机制
在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。
反射的使用
jdk提供了三种方式获取一个对象的Class,就User user来说
- user.getClass(),这个是Object类里面的方法
- User.Class属性,任何的数据类型,基本数据类型或者抽象数据类型,都可以通过这种方式获取类
- Class.forName(""),Class类提供了这样一个方法,让我们通过类名来获取到对象类
反射作用总结就是: - 动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。
- 应用程序需要在运行时从某个特定的程序集中载入一个特定的类。
什么是代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
什么是静态代理
顾名思义,就是提前创建好代理类文件并在程序运行前已经编译成字节码。通俗点将就是自己手写一个固定代理类。
什么是动态代理
是指在运行时动态生成代理类,即代理类的字节码将在运行时生成并载入到ClassLoader中。常见利用java反射机制,动态的生成了一个代理类,直接使用代理方法。
反思&扩展
动态代理的方式
- JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
- CGLIB动态代理:利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
- ASM:低级字节码生成工具,近乎使用bytecode编码,对开发人员要求最高。当然性能也是最好。
JDK动态代理和CGLIB字节码生成的区别?
- JDK动态代理只能对实现了接口的类生成代理,而不能针对类。
- CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!