典型定义
- 反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。通过反射我们可以直接操作类或对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
- 动态代理是一种方便运行时动态构造代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装RPC调用、面向切面的编程(AOP)。
- 实现动态代理的方式很多,比如JDK自身提供的动态代理,主要利用到了反射机制,更高性能的字节码操作机制,类似ASM,cglib等。
分类
- 静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。
- 动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外花费时间。
- JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象。新版本也开始结合ASM机制。
- cglib动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类。
- Java 发射机制的常见应用:动态代理(AOP、RPC)、提供第三方开发者扩展能力(Servlet容器,JDBC连接)、第三方组件创建对象(DI)
反射机制及其演进
反射的功能:①在运行时能判断任意一个对象所属的类。②在运行时能构造任意一个类的对象。③在运行时判断任意一个类所具有的成员变量和方法。④在运行时调用