一、JDK代理原理
JDK代理(即Java动态代理)是一种在运行期间动态生成代理类的方式,通过代理类间接地访问目标对象,实现该对象的增强。在代理类中实现同名接口的同名方法(被代理类的方法),并分别添加前置通知、后置通知、环绕通知等增强操作。
代理类的生成过程中,使用Java提供的反射API动态创建代理对象,增强被代理对象的业务功能,实现AOP编程的目的。通过JDK动态代理技术,可以在不修改原有Java类的基础上,实现对该类的增强,从而有效地解耦和提升了程序的可维护性。
二、下列选项中对JDK动态代理的描述
1、动态生成字节码实现代理;
2、在运行期间动态生成代理对象;
3、使用反射API动态创建代理对象;
4、必须依赖于接口;
5、实现了AOP编程中的横切关注点功能设计;
以上都是对JDK代理的正确描述。
三、JDK代理模式
在JDK代理模式中,定义了一个InvocationHandler接口,通过实现该接口的invoke方法,JDK会自动调用该方法并传递对应的参数和方法名。在该方法中编写代理对象的增强逻辑,实现对目标对象的业务功能增强。
四、为什么JDK动态代理必须基于接口
JDK代理基于接口主要是因为JDK动态代理是基于接口来生成代理对象的。当代理对象需要实现被代理对象的所有方法时,由于Java不支持多重继承,所以只能使用接口来定义代理类的类型。因此,被代理对象必须实现接口,代理类才能在编译期生成。
五、JDK代理核心类
在JDK动态代理中,核心的类如下:
// 代理处理器 java.lang.reflect.InvocationHandler // 代理工厂 java.lang.reflect.Proxy
六、JDK代理用了反射吗
是的,JDK代理用了反射。反射是JDK动态代理生成代理类的基础技术。在运行时生成代理对象时,JDK会动态生成实现被代理类的接口方法的代理方法,并通过反射方法调用的方式,完成对被代理对象方法的调用。
七、动态代理JDK和CGLIB区别
动态代理JDK和CGLIB代理的区别主要在于:JDK代理只能对实现了接口的类生成代理对象,而CGLIB代理则可以对普通Java类进行代理;另外,JDK代理生成代理对象的效率要高于CGLIB代理。
八、JDK代理底层实现原理
JDK代理底层实现原理主要是通过反射获取被代理对象的接口列表,然后通过Proxy类的newProxyInstance方法动态地生成代理类实例。创建代理类实例需要指定代理对象的类加载器、目标类所实现的接口数组和代理类的InvocationHandler对象。
九、JDK代理和CGLIB代理的区别
JDK代理和CGLIB代理的区别主要在于:JDK代理只能对实现了接口的类生成代理对象,而CGLIB代理则可以对普通Java类进行代理。
另外,JDK代理生成代理对象的效率要高于CGLIB代理。原因在于JDK代理生成代理对象时只需要动态生成一个实现了目标类所有接口的代理类,而CGLIB代理则需要通过动态生成子类的方式进行代理,代理效率相对较低。