2

次の前の質問(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

アノテーションが検出されないようです

だから私の質問は:特定の注釈を持つパラメータを検出する方法は?

誰かがそれを行う方法を知っていますか?

よろしくお願いします。

よろしく。

編集:私はこのスレッドのポイントカットマッチングメソッドを注釈付きパラメーターで見つけ、同じことについて議論し、与えられたソリューションを適用しましたが、機能しません。

4

1 に答える 1

16

私はあなたを正しく理解していることを願っています。

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
于 2012-05-15T07:02:29.067 に答える