2013-04-30 30 views
0

在我的例子公共靜態類的輔助,我有兩個包:package1含有類A(未聲明爲public)及其嵌套靜態類B(聲明爲public):反思 - 嵌套在包裝局部類

package package1;  
class A { 
    public static class B { 
     public B() { 
     } 
    } 
    public A() { 
    }  
} 

package2包含Main類與試圖反射性創建package1.A$B類的一個實例的簡單方法主要:

package package2;  
public class Main {  
    public static void main(String[] args) { 
     try { 
      Class<?> innerClass = Class.forName("package1.A$B"); 
      Object o = innerClass.newInstance(); 
      System.out.println(o); 
     } catch (ReflectiveOperationException e) { 
      e.printStackTrace(); 
     } 
    }  
} 

Surprisin甘(至少對我來說),這段代碼成功地做了一些事情,否則不可能沒有反思。經典import聲明(如import package1.A.B;import package1.A.*;)引發錯誤,認爲類A不可見。此外,不需要特別的可訪問性權限來創建B的實例。這是一種正常的行爲嗎?

編輯:它的工作原理也是,如果我以不同的方式得到內部類的引用,就像這樣:

Class<?> innerClass = Class.forName("package1.A").getClasses()[0]; 
+0

如何創建一個非公開的'A'類?它是否是其他公開課的一部分? – sanbhat 2013-04-30 09:17:14

+0

說「不公開」我的意思是默認(包)可見性。 – maurizeio 2013-04-30 09:23:15

回答

0

是的,這是一個絕對的罰款。當你像package.classname$innerclass這樣寫時,你可以得到靜態的內部類。

+0

好的,但在這種情況下,我期待在構造時產生一個'java.lang.IllegalAccessException' – maurizeio 2013-04-30 09:45:46

+0

當應用程序試圖反射創建一個實例(不是數組)時,會引發IllegalAccessException,設置或獲取一個字段或調用一個方法,但是當前正在執行的方法無法訪問指定的類,字段,方法或構造函數的定義。 B類是公共和靜態的,並且易於訪問 – 2013-04-30 09:48:21

+0

好,但如果因爲它是公共的而訪問類B是合法的,爲什麼不能直接導入類'package1.A.B'? – maurizeio 2013-04-30 09:59:06