資料來源於網上
JDK動態代理實際上是生成一個新的類,將增強和被代理類方法的代碼加入到新的類中。注意JDK動態代理需要被代理類實現接口。
原理:
1.拿到被代理類的引用,並且獲取它的所有的接口(反射獲取)
2.JDK Proxy類重新生成一個新的類,實現了被代理類的所有接口的方法。
3.動態生成JAVA代碼,把增強邏輯加入到新生成代碼中。
4.編譯生成新的JAVA代碼的class文件。
5.加載並重新運行新的class,得到的類就是全新的類。
動態代理處理器:
package com.example.scheduled.designModel.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKMeipo implements InvocationHandler {
private Object target;
public Object getInsnstance(Object person) throws Exception{
this.target=person;
Class<?> clazz=target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object obj=method.invoke(this.target,args);
after();
return obj;
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
}
被代理類:
package com.example.scheduled.designModel.proxy;
public class Girl implements Person {
@Override
public int findLove() {
System.out.println("高富帥");
return 0;
}
}
被代理類要實現的接口:
package com.example.scheduled.designModel.proxy;
public interface Person {
public abstract int findLove();
}
測試方法:
package com.example.scheduled.designModel.proxy;
public class JDKProxyTest {
public static void main(String[] args){
try {
Person obj=(Person) new JDKMeipo().getInsnstance(new Girl());
obj.findLove();
} catch (Exception e) {
e.printStackTrace();
}
}
}