web-dev-qa-db-ja.com

ProceedingJoinPointからJava.lang.reflect.Methodを取得しますか?

質問は短く簡単です:apsectj ProceedingJoinPointからMethodオブジェクトを取得する方法はありますか?

現在、私はやっています

Class[] parameterTypes = new Class[joinPoint.getArgs().length];
Object[] args = joinPoint.getArgs();
for(int i=0; i<args.length; i++) {
    if(args[i] != null) {
        parameterTypes[i] = args[i].getClass();
    }
    else {
        parameterTypes[i] = null;
    }
}

String methodName = joinPoint.getSignature().getName();
Method method = joinPoint.getSignature()
    .getDeclaringType().getMethod(methodName, parameterTypes);

しかし、私はこれが行く方法だとは思わない...

43
Erik

あなたの方法は間違っていませんが、より良い方法があります。 MethodSignature にキャストする必要があります

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
83
Bozho

Method method = signature.getMethod()はインターフェースのメソッドを返すため、注意が必要です。これを追加して、実装クラスのメソッドを確実に取得する必要があります。

    if (method.getDeclaringClass().isInterface()) {
        try {
            method= jointPoint.getTarget().getClass().getDeclaredMethod(jointPoint.getSignature().getName(),
                    method.getParameterTypes());
        } catch (final SecurityException exception) {
            //...
        } catch (final NoSuchMethodException exception) {
            //...                
        }
    }

(catchのコードは任意で空です。例外を管理するコードを追加する方が良いでしょう)

これにより、メソッドまたはパラメーターの注釈がインターフェイスにない場合にアクセスしたい場合に実装ができます。

42
Nordine