仅作为示例,请考虑ClassFileAssembler
包中的类sun.reflect
。
此类是包本地类:class ClassFileAssembler implements sun.reflect.ClassFileConstants {...
因此,我们甚至不能使用其名称ClassFileAssembler
,也无法直接导入它-这将导致编译器错误。
但是,我们可以在项目中创建名为sun.reflect
的程序包,并在此程序包内部使用ClassFileAssembler
名称-Java编译器会认为我们位于ClassFileAssembler
程序包中。
如果是这样,为什么不尝试获取对类对象的引用,即ClassFileAssembler.class
?Class<ClassFileAssembler> classFileAssemblerClass = ClassFileAssembler.class;
出乎意料的是,此代码导致运行时错误:java.lang.IllegalAccessError: tried to access class sun.reflect.ClassFileAssembler from class sun.reflect.Test
。
但是,我们仍然能够获取ClassFileAssembler
类对象:
Class<ClassFileAssembler> aClass = (Class<ClassFileAssembler>)Class.forName("sun.reflect.ClassFileAssembler");
它工作正常,并为我们提供了完整的类说明。
因此,问题是:
1)技术之间有什么区别?
Class.forName0
如何检索对类对象的引用,.class
如何实现?2)为什么他们会有如此不同的安全检查?
3)以这种方式保护
.class
引用的原因是什么?4)这些技术是否使用不同的类加载器?
最佳答案
如果选中javadoc of Class#forName
,您将看到:
请注意,此方法不检查其调用者是否可以访问所请求的类。
关于java - 程序包本地类的类文字和Class.forName的不同行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14518669/