代理模式
定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。
代理模式UML图
要理解代理模式很简单,其实生活当中就存在代理模式:
火车票代售
静态代理:代理类是在编译时就实现好的。也就是说 Java 编译完成后代理类是一个实际的 class 文件。
动态代理:代理类是在运行时生成的。也就是说 Java 编译完之后并没有实际的 class 文件,而是在运行时动态生成的类字节码,并加载到JVM中。
//========那动态代理就跟类加载器差不多,都是要生成字节码文件 动态代理是直接生成字节码文件
根据类加载器与接口数组唯一生成一个代理类对象(其实就是实现了接口的类,只不过是代码动态生成的,照这样说也可以生成委托类的子类)
动态代理public final。特点?
Java 实现动态代理的缺点:因为 Java 的单继承特性(每个代理类都继承了 Proxy 类),只能针对接口创建代理类,不能针对类创建代理类。
Java 动态代理的内部实现 自动生成的代理类的代码是
public final class $Proxy1 extends Proxy implements Subject{
private InvocationHandler h;
private $Proxy1(){}
public $Proxy1(InvocationHandler h){
this.h = h;
}
public int request(int i){
Method method = Subject.class.getMethod("request", new Class[]{int.class}); //创建method对象
return (Integer)h.invoke(this, method, new Object[]{new Integer(i)}); //调用了invoke方法
}
}
动态代理是动态new了一个实现类,作为了代理类的一个成员变量,通过通过调用接口的方法,回调了proxy.invoke(),再调用了实现类的方法
最近学到相关的后端知识Spring的AOP知识,用的就是JDK的动态代理以及CGLiB(动态字节码增强技术)
相关阅读: Spring AOP 深入剖析
网友评论