1.静态代理
/**
* Created by on 2021/8/2.
* SayHello接口
*/
public interface SayHello {
void sayHi();
}
/**
* Created by on 2021/8/2.
* 被代理对象 实现了SayHello接口
*/
public class Daviimplements SayHello {
@Override
public void sayHi() {
System.out.println("hello china");
}
}
/**
* Created by on 2021/8/2.
* 代理对象实现了SayHello 接口并且持有被代理对象
*/
public class ProxyObjectimplements SayHello{
SayHellosayHello;
public ProxyObject(SayHello sayHello) {
this.sayHello = sayHello;
}
@Override
public void sayHi() {
System.out.println("Do something before say Hi");
sayHello.sayHi();
System.out.println("Do something after say Hi");
}
}
使用静态代理我们可以很方便的在目标方法之前或之后加入一些其他的操作。比如 打印日志、权限集中申请、增加程序灵活度、解耦调用层与实现层等等。
2.动态代理
动态代理,是我们在程序运行时候。通过反射的方式,动态生成代理class,通过类加载器加载代理class到内存中,再通过反射获取代理对象。
import sun.misc.ProxyGenerator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
File file =new File("Chapter_02/Proxy/dynamic_proxy01/src/DynamicProxyImpl.class");
// 创建被代理对象
Davi davi =new Davi();
// 生成代理文件 ---其实就是生成代理对象的 class(二进制数组) 第一个参数是指定的class 名称 第二个参数是代理的接口
byte [] stream =ProxyGenerator.generateProxyClass("DynamicProxyImpl",new Class[]{davi.getClass()});
try {
FileOutputStream fos =new FileOutputStream(file);
fos.write(stream);
fos.flush();
fos.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
优缺点对比
相较于静态代理动态的灵活程度高,可以在运行时生成任意代理对象,静态代理是在编译时,生成的代理对象,在编译时期,代理对象已持有被代理者。程序灵活度不高扩展性差。因为动态代理是在运行时通过反射动态生成,动态代理的性能相较于静态代理稍逊一筹。