所有分类
  • 所有分类
  • 未分类

Spring工具类–AopUtils的使用

简介

本文介绍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;
}

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录