AspectJ的 - 检索注释的参数列表(AspectJ - Retrieve list of an

2019-07-29 09:41发布

从下面的前一个问题( AspectJ的-注释的存在在连接点的表达不认可 ),

我的目标:一方面,我希望能够提取/从匹配函数检索所有注释参数,不管有多少。 (然后应用上的一些治疗,但它不是这个问题的范围)

所以,就目前而言,这是我做了什么(不工作):

@Before("execution (* org.xx.xx.xx..*.*(@org.xx.xx.xx.xx.xx.Standardized (*),..))")
public void standardize(JoinPoint jp) throws Throwable {
    Object[] myArgs = jp.getArgs();
    getLogger().info("Here: arg length=" + myArgs.length);
    // Roll on join point arguments
    for (Object myParam : myArgs) {

        getLogger().info(
                    "In argument with " + myParam.getClass().getAnnotations().length
                                + " declaread annotations");
        getLogger().info("Class name is " + myParam.getClass().getName());
        // Get only the one matching the expected @Standardized annotation
        if (myParam.getClass().getAnnotation(Standardized.class) != null) {
            getLogger().info("Found parameter annotated with @Standardized");
            standardizeData(myParam.getClass().getAnnotation(Standardized.class), myParam);
        }
    }
}

这是由咨询匹配的代码:

public boolean insertLog(@Standardized(type = StandardizedData.CLIPON) CliponStat theStat) {
    // ...
}

和JUnit测试所产生的痕迹:

INFO: ICI: arg lenght=1
INFO: In argument with 0 declaread annotations

看起来它不检测注释

所以我的问题是:如何检测具有特定注释(S)的参数?

是否有人有一个想法,怎么办呢?

在此先感谢您的帮助。

问候。

编辑:我发现这个线程切入点的匹配带注释参数的方法 ,同样的事情讨论,并应用于给定的解决方案,但它不工作..

Answer 1:

我希望我理解你的权利。

myParam.getClass().getAnnotations()为您提供了一个类的注释。 就像是:

@Standardized(type = StandardizedData.CLIPON)
public class Main{...}

也许这个切入点/建议可以帮助你:

@Before("execution (* org.xx.xx.xx..*.*(@org.xx.xx.xx.xx.xx.Standardized (*),..))")
public void standardize(JoinPoint jp) throws Throwable {
    Object[] args = jp.getArgs();
    MethodSignature ms = (MethodSignature) jp.getSignature();
    Method m = ms.getMethod();

    Annotation[][] parameterAnnotations = m.getParameterAnnotations();

    for (int i = 0; i < parameterAnnotations.length; i++) {
        Annotation[] annotations = parameterAnnotations[i];
        System.out.println("I am checking parameter: " + args[i]);
        for (Annotation annotation : annotations) {
            System.out.println(annotation);

            if (annotation.annotationType() == Standardized.class) {
                System.out.println("we have a Standardized Parameter with type = "
                        + ((Standardized) annotation).type());
            }
        }
    }
}

这给了我下面的输出:

I am checking parameter:  main.CliponStat@331f2ee1 
@annotation.Standardized(type=CLIPON)
we have a Standardized Parameter with type = CLIPON


文章来源: AspectJ - Retrieve list of annotated parameters