李文轩 2019-03-18
声明:这是本人学习极客时间的Java核心36讲的笔记,有侵权请联系我。
反射机制
- 反射最大的作用之一就在于我们可以不在编译时知道这个对象的类型,而在运行时通过提供完整的“包名+类名.class“得到
- 不是在编译时,是在运行时。
功能:
- 在运行时能判断任意一个对象所属的类。
- 在运行时能构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时调用任意一个对象的方法。
利用Java反射机制,我们可以加载一个运行时才得知的class,获悉其构架方法,并生成其对象的实体,能对其fields设值,并唤起其methods。
应用场景:
- 反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法;
运行时动态加载需要加载的对象就是用反射的原因。
特点:
- 由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,就不需要用反射。
- 反射调用方法时,可以忽略权限检查,因此有可能会破坏封装性而导致安全问题。
动态代理
- 为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在两者之间起到中介作用
- 实现阶段不用关心代理谁,而是在运行阶段才制定哪一个对象。若自己写代理类的方法就是静态代理。
组成要素:
- 抽象类接口
- 被代理类(具体实现抽象接口的类)
- 动态代理类:实际调用被代理类的方法和属性的类
实现方式:
- 实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了反射机制。还有其他的实现方式,比如利用字节码操作机制,类似 ASM、CGLIB(基于 ASM)、Javassist 等。
- 举例,常可采用的JDK提供的动态代理接口InvocationHandler来实现动态代理类。其中invoke方法是该接口定义必须实现的,它完成对真实方法的调用。通过InvocationHandler接口,所有方法都由该Handler来进行处理,即所有被代理的方法都由InvocationHandler接管实际的处理任务。此外,我们常可以在invoke方法实现中增加自定义的逻辑实现,实现对被代理类的业务逻辑无侵入。