AOP
2022-04-04 本文已影响0人
zhemehao819
一、实现方式
1. AOP 实现之 ajc 编译器
在编译时期,通过使用ajc编译器对class文件进行修改增强功能。
2. AOP 实现之 agent 类加载
在类加载时期,通过 agent 修改 class 实现增强。
3. AOP 实现之 proxy代理
- jdk动态代理
- cglib 代理
二、JDK动态代理
样例
public class JdkProxyDemo {
interface Foo {
void foo();
}
static class Target implements Foo {
public void foo() {
System.out.println("target foo");
}
}
public static void main(String[] param) {
// 目标对象
Target target = new Target();
// 代理对象
Foo proxy = (Foo) Proxy.newProxyInstance(
Target.class.getClassLoader(), new Class[]{Foo.class},
(p, method, args) -> {
System.out.println("proxy before...");
Object result = method.invoke(target, args);
System.out.println("proxy after...");
return result;
});
// 调用代理
proxy.foo();
}
}
运行结果
proxy before...
target foo
proxy after...
jdk 动态代理要求目标**必须**实现接口
,生成的代理类实现相同接口,因此代理与目标之间是平级兄弟关系
三、cglib 代理
样例
public class CglibProxyDemo {
static class Target {
public void foo() {
System.out.println("target foo");
}
}
public static void main(String[] param) {
// 目标对象
Target target = new Target();
// 代理对象
Target proxy = (Target) Enhancer.create(Target.class,
(MethodInterceptor) (p, method, args, methodProxy) -> {
System.out.println("proxy before...");
Object result = methodProxy.invoke(target, args);
// 另一种调用方法,不需要目标对象实例
// Object result = methodProxy.invokeSuper(p, args);
System.out.println("proxy after...");
return result;
});
// 调用代理
proxy.foo();
}
}
- cglib 不要求目标实现接口,它生成的代理类是目标的子类,因此代理与目标之间是子父关系
- final 类无法被 cglib 增强