在我的例子公共靜態類的輔助,我有兩個包: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];
如何創建一個非公開的'A'類?它是否是其他公開課的一部分? – sanbhat 2013-04-30 09:17:14
說「不公開」我的意思是默認(包)可見性。 – maurizeio 2013-04-30 09:23:15