メソッドの上の@CallerSensitive
アノテーションは何を意味していますか?
たとえば、アノテーションはクラスのgetClassLoaderメソッドにあります
@CallerSensitive
public ClassLoader getClassLoader() {
//
}
コメントでリンクしたJEPによると(これも here )、
呼び出し元に依存するメソッドは、直接の呼び出し元のクラスに応じて動作を変化させます。 _
Sun.reflect.Reflection.getCallerClass
_メソッドを呼び出すことにより、呼び出し元のクラスを検出します。
Class#forName(String)
の実装を見ると
_@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className, true,
ClassLoader.getClassLoader(Reflection.getCallerClass()));
}
_
、あなたはそれが Reflection.getCallerClass()
を使用していることに気づきます。その方法を見れば
このメソッドを呼び出すメソッドの呼び出し元のクラスを返します。
Java.lang.reflect.Method.invoke()
に関連付けられたフレームとその実装は無視されます。
_@CallerSensitive
public static native Class getCallerClass();
_
このJEP以前は、呼び出し元の機密メソッドが直接ではなくリフレクションを介して呼び出された場合、実際の呼び出しクラスが何であるかを識別するために複雑なプロセスが必要だったように思われました。メソッドがリフレクションを介して呼び出された場合、これには問題がありました。単純なプロセスが_@CallerSensitive
_で提案(および導入)されました。
基本的に、_@CallerSensitive
_アノテーションはJVMによって使用されます
JVMはこのアノテーションを追跡し、オプションで、_
Sun.reflect.Reflection.getCallerClass
_メソッドがメソッドの呼び出し元を報告できるという不変式を、そのメソッドがこのアノテーションでマークされている場合にのみ報告します。