web-dev-qa-db-ja.com

Sun.reflect.CallerSensitiveアノテーションはどういう意味ですか?

メソッドの上の@CallerSensitiveアノテーションは何を意味していますか?

たとえば、アノテーションはクラスのgetClassLoaderメソッドにあります

 @CallerSensitive
    public ClassLoader getClassLoader() {
    //
    }
32
Kumar Abhinav

コメントでリンクした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_メソッドがメソッドの呼び出し元を報告できるという不変式を、そのメソッドがこのアノテーションでマークされている場合にのみ報告します。

44