2014-03-25 69 views

回答

38

據的getClassLoader方法我鏈接到註釋(也here)的JEP,

呼叫者敏感方法而變化其行爲根據其直接呼叫者的類 。它通過調用 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方法可以 只報告的方法的調用者時該方法標註爲 此註釋。

+0

所以我明白,它是有用的反映識別調用者類,對嗎?並且由於JVM正在跟蹤它,JVM將無法識別任何在其方法中具有此註釋的自定義類那麼它對Core庫有用嗎? –

+1

@AbhinavKumar是的,那是我的理解。但我認爲自定義類也可以使用它。你必須嘗試一下。 –

+1

我很驚訝地發現這個太陽內部的API泄漏到了JDK的公共API中。爲什麼不是不是'java.lang.reflect.CallerSensitive'註釋? –