动态代理
一、实现动态代理的方式:
- jdk动态代理
- CGlib动态代理
- javassist动态代理
CGlib底层实现依赖于ASM, javassist自成一派. 由于ASM和javassist需要程序员直接操作字节码,导致使用技术门槛较高,JDK底层使用反射,但是最终也是操作字节码. Dubbo采用的javassist代理,动态的在内存当中生成所代理的字节码,来完成代理的功能.
二、JDK动态代理
需要的必要条件: 该类需要实现一个接口,这个接口就是JDK动态代理的基础.
public interface Person{
void speak();
@MethodName("run")
void run();
}
创建需要代理的类:
public class Wang implements Person {
@Override
public void speak() {
System.out.println("You are so nice!");
}
@Override
public void run() {
System.out.println("Running is good for you!");
}
}
创建代理类: 1) 代理类实现InvocationHandler接口 2) Proxy.newInstance() 方法创建代理类 3) 实现invoke方法
public class TargetProxyA implements InvocationHandler{
private Object target;
public TargetProxyA(Object target) {
this.target = target;
}
public static Object getInstance(Object target) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),
new TargetProxyA(target));
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
return method.invoke(target, args);
after();
}
private void before(){
System.out.println("操作前处理!");
}
private void after(){
System.out.println("后续处理");
}
}
调用代理
public class Client{
public static void main(String[] args) {
Person personWang = (Person) TargetProxyA.getInstance(new Wang());
personWang.speak();
}
}