1.目标类接口
package com.arvon.jdkproxy;
/**
* 目标类接口
* 目标类和动态生成的代理对象都实现的接口
*@author Huangwen
*2017-3-29
*/
public interface ITargetClass {
/**
* 主业务逻辑方法
*/
public void mainLogicMethod();
}
2.目标类实现类
package com.arvon.jdkproxy;
public class TargetClassImpl implements ITargetClass {
public void mainLogicMethod() {
System.out.println(">>>>>>>TargetClassImpl.mainLogicMethod(),主业务方法执行...");
}
}
3.代理对象的拦截器
package com.arvon.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 代理对象的拦截器
*@author Huangwen
*2017-3-29
*/
public class TargetClassInterceptor implements InvocationHandler {
private TargetClassImpl targetClassImpl;
public TargetClassInterceptor(TargetClassImpl targetClassImpl) {
this.targetClassImpl = targetClassImpl;
}
/**
* 生成的代理对象 所实现目标类接口中定义的相关方法的具体实现
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(">>>>>>before method.invoke(),这里代表代理对象在主业务逻辑方法执行前织入的代码");
method.invoke(targetClassImpl, args);
System.out.println(">>>>>>>after method.invoke(),这里代表代理对象在主业务逻辑方法执行后织入的代码");
return null;
}
}
4.测试类
package com.arvon.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* 客户端 测试类
*@author Huangwen
*2017-3-29
*/
public class Client {
public static void main(String[] args) {
TargetClassImpl targetClassImpl = new TargetClassImpl();
targetClassImpl.mainLogicMethod();
System.out.println("====================================");
InvocationHandler h = new TargetClassInterceptor(targetClassImpl);
/**
* 以下代码会生成一个$Proxy对象,该对象实现了ITargetClass,具体的方法体就是InvocationHandler里面的invoke方法。
*/
ITargetClass proxyInstance =(ITargetClass) Proxy.newProxyInstance(targetClassImpl.getClass().getClassLoader(), targetClassImpl.getClass().getInterfaces(), h);
proxyInstance.mainLogicMethod();
}
}
5.打印的结果
>>>>>>>TargetClassImpl.mainLogicMethod(),主业务方法执行...
====================================
>>>>>>before method.invoke(),这里代表代理对象在主业务逻辑方法执行前织入的代码
>>>>>>>TargetClassImpl.mainLogicMethod(),主业务方法执行...
>>>>>>>after method.invoke(),这里代表代理对象在主业务逻辑方法执行后织入的代码
理解Jdk动态代理的原理是理解spring aop 原理的前提。