简介
本文介绍Spring的AOP的工具类:AopUtils。
用法大全
判断代理类型
// 判断是不是 Spring 代理对象 boolean isAopProxy() // 判断是不是 jdk 动态代理对象 isJdkDynamicProxy() // 判断是不是 CGLIB 代理对象 boolean isCglibProxy()
获取被代理对象的 class
// 获取被代理的目标 class Class<?> getTargetClass()
相关工具
AopContext
//获取当前对象的代理对象 Object currentProxy()
获得目标对象
没有现成的工具类,需要手写。
参考Spring的测试代码(AopTestUtils#getTargetObject),见:这里
内容是这样的:
@SuppressWarnings("unchecked")
public static <T> T getTargetObject(Object candidate) {
Assert.notNull(candidate, "Candidate must not be null");
try {
if (AopUtils.isAopProxy(candidate) && candidate instanceof Advised) {
Advised advised = (Advised) candidate;
Object target = advised.getTargetSource().getTarget();
if (target != null) {
return (T) target;
}
}
}
catch (Throwable ex) {
throw new IllegalStateException("Failed to unwrap proxied object", ex);
}
return (T) candidate;
}
@SuppressWarnings("unchecked")
public static <T> T getUltimateTargetObject(Object candidate) {
Assert.notNull(candidate, "Candidate must not be null");
try {
if (AopUtils.isAopProxy(candidate) && candidate instanceof Advised) {
Advised advised = (Advised) candidate;
Object target = advised.getTargetSource().getTarget();
if (target != null) {
return (T) getUltimateTargetObject(target);
}
}
}
catch (Throwable ex) {
throw new IllegalStateException("Failed to unwrap proxied object", ex);
}
return (T) candidate;
}

请先 !