2015-11-23 150 views
6

我一直在思考類,特別是關於匿名內部類。這讓我想知道匿名內部類的訪問類型是什麼?匿名內部類的訪問類型是什麼?

我認識到在大多數情況下,這不會改變任何東西,但它可能會對反射產生影響。我已經看到幾個問題,詢問如何使用反射來訪問匿名內部類的內容。

我發現這個問題(這個問題的一個例子): access exception when invoking method of an anonymous class using java reflection

而這個答案,表明它是私有的,但筆者無法證實: https://stackoverflow.com/a/2659647/3049628

+0

我認爲你引用的類本身不脫毛多少光的問題。錯誤是由於一個錯誤,而錯誤是關於方法的可訪問性,而不是類。班級本身不是一個成員,因此「訪問」它是毫無意義的。 – RealSkeptic

回答

4

看起來他們是公衆,但是JDK的Method.invoke實現有一個(長期運行的)錯誤。請參閱bug 4071957

鏈接的錯誤並不真實地與我們的情況相對應,但是它彙總了所有類型的Method.invoke訪問控制問題而非內部類,並且被標記爲bug 4819108的重複項,它被鏈接到您提到的SO問題的接受答案中。

+1

哇,'提交日期:1997-08-14'(!!) – Tgsmith61591

+0

是的,看起來他們想改變自java 1.1以來的類文件格式,這將有助於解決這個問題。它已在2014年更新,所以也許他們並沒有完全放棄所有希望這樣做...... – Aaron

3

class本身似乎有外包的包。

getModifiers() value is 8,根據評論是:static, package private

static(爲什麼?)。我無法在Main的匿名課堂內參考Main.this

package private。儘管如此,匿名類的訪問級別甚至沒有多大意義,因爲在編譯時您不能像普通類一樣使用它的類型。

https://ideone.com/vzbdQ5

// JDK 8 
import java.lang.reflect.Modifier; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     Class anon = new Main() {}.getClass(); 

     System.out.println("Name:" + anon.getName()); // Main$1 
     System.out.println("Anonymous:" + anon.isAnonymousClass()); // true 
     System.out.println("Package:" + anon.getPackage()); // null 

     System.out.println("public ? " + Modifier.isPublic(anon.getModifiers())); // false 
     System.out.println("private ? " + Modifier.isPrivate(anon.getModifiers())); // false 
     System.out.println("protected ? " + Modifier.isProtected(anon.getModifiers())); // false 

     assert anon.newInstance() instanceof Main; 
     assert Class.forName(anon.getName()).newInstance() instanceof Main; 
    } 
} 
+0

@assylias謝謝。再次測試,anon類與外部類具有相同的包。 –

+0

我認爲它只是靜態的,因爲它是用靜態方法聲明的。在其他方法中,它不會是靜態的。至於它是「包私人」 - 它實際上只是默認,它被解釋爲「包私人」。但對於既不是成員也不是頂級*的班級,這是沒有意義的。 – RealSkeptic