ほとんどの人がやりたいこととは正反対のことが必要です。つまり、className と methodName を持つ StackTraceElement があります。メソッドは特定のクラスが実装するインターフェイスに属しているため、メソッドがどのインターフェイスで発生したかをメソッドに問い合わせる方法が必要です。
私は呼び出すことができ、Class.forName(className)
また呼び出すこともできますが、元のインターフェイスではなく、言及されたクラスの名前で返されます。すべてのクラスのインターフェイスを繰り返し処理して、その特定のメソッドを見つけることはしたくありません。これにより、パフォーマンスが実質的に無効になります。clazz.getMethod(methodName)
method.getDeclaringClass()
--
基本的に、これは従来のブロードキャスト メカニズムです。ブロードキャスター クラスにはハッシュマップが含まれます。キーはインターフェイスであり、値は実装クラスのリストです。ブロードキャスターは、各メソッドがハッシュマップから実装クラスを取得し、それらを反復処理して、各実装クラスで同じメソッドを呼び出すように、同じインターフェースを実装します。
--
ここに追加して申し訳ありませんが、コメント内に追加するには少し長すぎます:
私の解決策は、アンドレアスが言及しているものに似ていました:
StackTraceElement invocationContext = Thread.currentThread().getStackTrace()[2];
Class<T> ifaceClass = null;
Method methodToInvoke = null;
for (Class iface : Class.forName(invocationContext.getClassName()).getInterfaces()) {
try {
methodToInvoke = iface.getMethod(invocationContext.getMethodName(), paramTypes);
ifaceClass = iface;
continue;
} catch (NoSuchMethodException e) {
System.err.println("Something got messed up.");
}
}
like 構造を使用するinvocationContext
とインターセプターを作成できるため、トランスミッターには、実装本体が空のアノテーション付きメソッドのみを含めることができます。