举例
java中动态代理主要有JDK和CGLIB两种方式。JDK代理是面向接口的代理。而CGLIB是代理类。
JDK代理的实现是通过Proxy
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(),InvocationHandler);为接口创建一个代理类。
通过实现InvocationHandler实现具体的代理逻辑。
创建接口
public interface PhoneService {
void call();
}
接口实现
public class PhoneServiceImpl implements PhoneService {
@Override
public void call() {
System.out.println("phone call");
}
}
代理逻辑实现(实现InvocationHandler)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
//被代理的类
private Object target;
public MyInvocationHandler(Object target) {
super();
this.target = target;
}
/**
*切面逻辑实现
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("phone call begin");
Object result = method.invoke(target,args);
System.out.println("phone call end");
return result;
}
/**
* 获取代理对象
* @return
*/
public Object getProxy() {
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(),this);
}
}
测试类
public class JdkProxyTest {
public static void main(String[] args) {
PhoneService service = new PhoneServiceImpl();
MyInvocationHandler handler = new MyInvocationHandler(service);
PhoneService proxyService = (PhoneService) handler.getProxy();
proxyService.call();
}
}