JDK 动态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//接口
public interface Subject {
void doSomeThink();
}

//实现类
public class RealSubject implements Subject{

@Override
public void doSomeThink() {
System.out.println("Do some thing");
}
}
//代理实现类
/**
* @author devin
* @version 1.0.2
* @date 2021-03-16 15:49
*/
public class JDKProxy implements InvocationHandler {
private Object target;
public JDKProxy(Object target) {
this.target = target;
}
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("do some thing before");
Object result = method.invoke(target,args);
System.out.println("do some thing after");
return result;
}
}

// main 类
public class Main {
public static void main(String[] args) {
Subject subject = new JDKProxy(new RealSubject()).getProxy();
subject.doSomeThink();
}
}
  1. 如何实现流程

    1. 为接口创建代理类的字节码文件
    2. 将字节码文件加载到JVM
    3. 创建代理类实例对象,执行目标的方法
  2. proxy实现了哪些工作

    1. 代理类继承了Proxy类并且实现了要代理的接口,由于java不支持多继承,所以JDK动态代理不能代理类
    2. 重写了equals、hashCode、toString
    3. 有一个静态代码块,通过反射或者代理类的所有方法
    4. 通过invoke执行代理类中的目标方法doSomething

Donate comment here