Java 动态代理
动态代理其实是 Java
设计模式中的一种也是各大框架都多多少少会使用到的一种设计模式,因为这个设计模式还是比较常用也比较重要的,今天我就把我知道了解的设计模式-动态代理给你分享一下。
代理模式我们可以分为 动态代理
、静态代理
。
静态代理
由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
代码案例
/**
* 创建动物接口
**/
public interface Animal {
void run();
}
/**
* 创建猫类
* */
public class Cat implements Animal {
// 实现 run 方法
@Override
public void run() {
System.out.println("小猫咪正在跑~");
}
}
/**
* 创建动物代理类
* */
public class AnimalProxy {
private final Animal animal;
public AnimalProxy(Animal animal) {
this.animal = animal;
}
/**
* 执行静态代理方法
**/
public void doProxy() {
animal.run();
}
}
动态代理
动态代理也会有两种,JDK 动态代理
、CGLIB 动态代理
,这两个的区别:
Jdk 代理
1:这个是使用 Jdk
反射机制生成一个代理接口的匿名类,在调用方法前用 InvockHandler
这个接口的实现类类处理。
2:不需要依赖第三方的类库就可以直接实现
3:依赖于 interface 接口
Cglib 代理
1:Cglib
是基于 Asm
字节码处理框架,是通过修改字节码生成子类来生成的。
我们今天就暂时不讲解 CGLIB
的实现方式,暂时只讲解 DJK
方式的实现方式。
首先我们需要一个接口
public interface Animal {
void run();
}
创建代理类
public class AnimalProxy implements InvocationHandler {
private final Object target;
public AnimalProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,就是使用反射机制实现;
System.out.println("动态代理被掉用 ~");
return method.invoke(target, args);
}
}
运行的类
public static void main(String[] args) {
Cat cat = new Cat();
Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new AnimalProxy(cat));
}
static class Cat implements Animal {
@Override
public void run() {
System.out.println("小猫咪正在通过动态代理跑步 ~");
}
}
这就是一个简单的 Jdk
动态代理的小 DEMO ~