问题描述
已知信息:1. 不同的类加载器对应不同的命名空间,不同的类加载器加载的类不能相互访问2. String类是由启动类加载器BootStrap加载的加入我自己创建了一个类A,A里用到String类,String类是由启动类加载器加载的,而类A是有应用类加载器(加载类路径中的类)加载的。疑问:类A和String类由不同的类加载器加载,为什么可以相互访问哪? 问题补充:多谢你们的回答,但我觉得你们的回答跟《深入Java虚拟机》第三章安全 3.3节类装载器体系结构讲的不一样啊,里面举了java.lang.Virus这个例子,不就说明子类加载器加载的类不能访问父类加载器加载的类吗?
解决方案
还得补充一点:不同并且不是上下层关系的加载器加载的类并不能相互强制转化。(我想大家原意是这个,而不是相互访问的问题)
解决方案二:
1:类本身的访问权限2:同一个JAVA文件只能引用一个类名
解决方案三:
引用1.父加载器加载的类不能访问子加载器加载的类。2.子加载器加载的类可以访问父加载器加载的Public类,但不能访问父加载器加载的包访问范围的类。 我想我的本意不是这个。我的意思是不同加载器中相同名称的类无法在同一命名空间(我的理解是一个JAVA文件中)共存,但是可以按照正常的包访问机制进行访问。 我的理解是从我的经验得出,总结得有偏颇的地方请指出。
解决方案四:
java.lang包是系统启动类加载的,那么如果有个名为java.lang.Virus在其它classloader中加载的能不能具有friend权限呢?作者给出的结论是,java.lang.Virus虽然具有相同的包名,但是由于是不同的classloader加载,因此不具有访问java.lang包的firend权限。至于private,私有的就是私有的,通常是无法访问的。public就是public,通常都是可以访问的。而我们的讨论不是局限在类的访问权限上的,而在如果当一个类的方法就算为public时,其他classloader能不能访问呢?我给出的答案是可以的。
解决方案五:
java.lang.Virus是不能访问JAVA API中的java.lang中的类是指Virus不能访问java.lang包中的包访问修饰符的内容java的访问修饰符有private,public等,默认的就是包访问比如,如果String类中有一个方法methodA(),是包访问的范围,那么java.lang包中的类就可以调用这个方法,而java.lang包外的类不能调用String的这个方法java.lang.Virus跟String都是java.lang包中的,但Virus是子加载器加载的,所以它的包范围就仅限于子加载器加载的java.lang包,访问不到String的methodA()public修饰符是没有这个限制的,只要父加载器中加载的public方法都可以访问
解决方案六:
引用多谢你们的回答,但我觉得你们的回答跟《深入Java虚拟机》第三章安全 3.3节类装载器体系结构讲的不一样啊,里面举了java.lang.Virus这个例子,不就说明子类加载器加载的类不能访问父类加载器加载的类吗? 我把这章节读了一遍,没看到你说的引用子类加载器加载的类不能访问父类加载器加载的类
解决方案七:
我不知道你们所描述的不同的类加载器加载的类不能相互访问是不是指通常情况下一个类加载器加载的类很难以调用另一个加载器的类。但是这不是绝对的,在通常代码编写时,我们实在无法在一个java文件中引用两个相同的包名,而java文件在当前类中已将引用的java包使用默认的classloader加载完成,那么我们实在无法调用另一个classloader生成相同的类。这会导至classcastexception。但是很明显,由于反射的存在,我们并不需要在当前类中引用什么类,就可以实现实例化一个对象的目的,而这些对象是完全独立的,且不会受到当前类的classloader的限制,那么他们是可以相互访问的。
解决方案八:
楼上的解决很正确。不同的类加载器加载的类不能相互访问,是要排除一种情况的,就是“子加载器和父加载器加载”。
解决方案九:
那是类A访问String,不是相互访问类加载器是有层级的,启动类加载器是应用类加载器的父加载器而子加载器加载的类是可以访问父加载器加载的类的也就是类A是可以访问到String,但String类不能访问到类A
解决方案十:
引用不同的类加载器加载的类不能相互访问 谁说的,可以访问呀