如何在 spring 代理 class 中使用方法#getAnnotatedParameterTypes()

How to Method#getAnnotatedParameterTypes() in spring proxied class

我正在使用 spring-boot 2+ 并创建了一些自定义注释;

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{
}

做的时候:

final AnnotatedType[] annotatedTypes = mostSpecificMethod.getAnnotatedParameterTypes();

//this will get the original class
//final Class<?> clazz = AopProxyUtils.ultimateTargetClass(bean);

Class<?> annotatedMappedClass = null;
for (AnnotatedType annotatedType : annotatedTypes) {
    if (annotatedType.isAnnotationPresent(MyCustomAnnotation.class)) {
        annotatedMappedClass = TypeFactory.rawClass(annotatedType.getType());
    }
}

当 bean 不是代理时它可以工作,但是当我添加 @Transactional 注释时它会变成代理并停止工作。在目标 class 中查找的 Spring Util 是什么?

据我所知,您需要这个豆子。使用:

Method invocableMethod = AopUtils.selectInvocableMethod(mostSpecificMethod, bean.getClass());

似乎有效。

还有一个比较复杂的:

    Method method = mostSpecificMethod;
    if (AopUtils.isAopProxy(bean)) {
        try {
            Class<?> clazz = AopProxyUtils.ultimateTargetClass(bean);
            method = clazz.getMethod(mostSpecificMethod.getName(), mostSpecificMethod.getParameterTypes());
        }
        catch (SecurityException ex) {
            ReflectionUtils.handleReflectionException(ex);
        }
        catch (NoSuchMethodException ex) {
            throw new IllegalStateException("...", ex);
        }
    }