通过实现接口的方式 -> JDK 动态代理
通过继承类的方式 -> CGLIB 动态代理
注:使用 ASM 对使用者要求比较高,使用 Javassist 会比较麻烦
JDK 动态代理
JDK 动 态 代 理 主 要 涉 及 两 个 类 : java.lang.reflect.Proxy 和
java.lang.reflect.InvocationHandler,我们仍然通过案例来学习
编 写 一 个 调 用 逻 辑 处 理 器 LogHandler 类 , 提 供 日 志 增 强 功 能 , 并 实 现
InvocationHandler 接口;在 LogHandler 中维护一个目标对象,这个对象是被
代理的对象(真实主题角色);在 invoke 方法中编写方法调用的逻辑处理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;
public class LogHandler implements InvocationHandler {
Object target; // 被代理的对象,实际的方法执行者
public LogHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
before();
Object result = method.invoke(target, args); // 调用 target 的
method 方法
after();
return result; // 返回方法的执行结果
}
// 调用 invoke 方法之前执行
private void before() {
System.out.println(String.format("log start time [%s] ", new
Date()));
}
// 调用 invoke 方法之后执行
private void after() {
System.out.println(String.format("log end time [%s] ", new
Date()));
}
}
编 写 客 户 端 , 获 取 动 态 生 成 的 代 理 类 的 对 象 须 借 助 Proxy 类 的
newProxyInstance 方法,具体步骤可见代码和注释
import proxy.UserService;
评论0