jdk的动态代理是通过反射机制生成一个实现代理接口的匿名类,调用具体方法前调用invocationhandler的invoke方法处理.所以使用jdk实现的动态代理的话需要在代理类实现invocationhandler接口,被代理类需要至少实现一个接口。匿名类的实现原理可以查看Proxy类这里不做延伸了。
package com.smartdec;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestJdkProxyDemo implements InvocationHandler {
private final JdkProxyServiceImpl jdkProxy;
public TestJdkProxyDemo(JdkProxyServiceImpl jdkProxy) {
this.jdkProxy = jdkProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("befor");
method.invoke(jdkProxy, args);
System.out.println("after");
return args[0];
}
public Object getProxy() {
return Proxy.newProxyInstance(jdkProxy.getClass().getClassLoader(), jdkProxy.getClass().getInterfaces(), this);
}
public static void main(String[] args) {
JdkProxyServiceImpl jdkProxy = new JdkProxyServiceImpl();
TestJdkProxyDemo demo = new TestJdkProxyDemo(jdkProxy);
JdkProxyService proxy = (JdkProxyService) demo.getProxy();
String mm = proxy.writeName("mm");
System.out.println(mm);
}
}