动态代理可以帮助我们理解AOP思想,所以就想着自己动手写一写JDK动态的实现。
首先一个接口
/**
* 需要代理的类和代理的接口
* @ClassName Subject
* @Description
* @author wp
*
*/
public interface Subject {
public void active();
}
需要被代理的类
/**
* 实体类
* @ClassName RealSubject
* @Description
* @author wp
*
*/
public class RealSubject implements Subject{
public void active() {
System.out.println("实体类");
}
}
然后JDK动态代理需要实现一个InvocationHandler的接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 实现动态代理的类
* @ClassName MyInvokeHandler
* @Description
* @author wp
*
*/
public class MyInvokeHandler implements InvocationHandler{
private Subject sub;
public MyInvokeHandler(Subject sub) {
this.sub = sub;
}
public Object getProxy() {
return Proxy.newProxyInstance(sub.getClass().getClassLoader(), sub.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object Obj = method.invoke(sub, args);
return Obj;
}
}
getProxy()方法可以获得代理对象,invoke(Object proxy, Method method, Object[] args)方法则可以调用具体方法,原理是java的反射机制。
最后一个测试的main方法
public class ProxyTest {
public static void main(String[] args) {
Subject real = new RealSubject();
MyInvokeHandler my = new MyInvokeHandler(real);
Subject proxy = (Subject) my.getProxy();
proxy.active();
}
}
得到代理对象后,就可以通过代理对象调用接口中方法实现代理。