質問は短く簡単です: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);
しかし、私はこれが行く方法だとは思わない...
あなたの方法は間違っていませんが、より良い方法があります。 MethodSignature
にキャストする必要があります
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
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のコードは任意で空です。例外を管理するコードを追加する方が良いでしょう)
これにより、メソッドまたはパラメーターの注釈がインターフェイスにない場合にアクセスしたい場合に実装ができます。