java面试题(杨晓峰)---第六讲谈谈动态代理是基于什么原理?

时间:2024-01-18 14:21:26

我在编译时不知道,而在运行时知道,那么肯定在运行时给了提示,这个提示就是额外功.好处是可以重复利用相同代码.

代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,...让应用开发者可以只关心自身业务.

静态代理:事先写好代码类,可以手工编写,也可以用工具生成.缺点是每个业务类都要有一个对应代理类,非常不灵活.

动态代理:运行时自动生成代理对象.缺点是生成代理对象和调用代理对象都要额外花费时间,

JDK动态代理:基于java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象.新版本也开始结合ASM机制.

cglib动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类..

java反射机制的常见应用:动态代理(AOP,RPC),提供第三方开发者拓展能力(Servlet容器,JDBC连接),第三方组件创建对象(DI)...

反射与动态代理原理:

反射最大的作用之一就在于我们可以不在编译时知道某个对象的类型,而在运行时提供完整的"包名+类名.class"得到.注意:不在编译时,而是在运行时.

功能:

#在运行时能判断任意一个对象所属的类.

#在运行时能构造任意一个类的对象

#在运行时能获得任意一个类所具有的的成员变量和方法.

#在运行时调用任意一个对象的方法.简单说,利用java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设置并唤起其methods.

应用场景:

反射技术常用在各类通用框架开发中.因为为了保证框架的通用性,需要根据配置文件加载不同的对象和类,并调用不同的方法,这个时候就会用到反射---运行时动态加载需要加载的对象.

特点:

由于反射会额外消耗一定的系统资源,因此如果不需要动态的创建一个对象,那么就不需要用反射.另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题.

2动态代理

为其他对象提供一种代理以控制对这个对象的访问,在某种情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在两者之间起到中介的作用.所谓动态代理,就是实现阶段不用关心代理谁,而是在运行阶段才指定代理那个对象,如果是自己写代理类的方法就是静态代理(确定性).

组成要素:

(动态)代理模式主要涉及三个要素:

#1:抽象类接口

#2:被代理类(具体实现抽象接口的类)

#3:动态代理类:实际调用被代理类的方法和属性的类

实现方法:

实现动态代理的方法有很多,比如JDK自身提供的动态代理,就是主要利用了反射机制,还有其他的实现方式,比如利用字节码操作机制,类似ASM,CGLIB(基于ASM),Javassist等.

举例:常常采用JDK提供的动态代理接口InvocationHandler来实现动态代理类.