java 类加载器 疑惑

问题描述

已知信息: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
解决方案十:
引用不同的类加载器加载的类不能相互访问 谁说的,可以访问呀

时间: 2024-10-29 06:43:31

java 类加载器 疑惑的相关文章

一篇文章读懂Java类加载器

Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上一搜一大片,我自己也看过很多文档,博客.资料虽然很多,但还是希望通过本文尽量写出一些自己的理解,自己的东西.如果只是重复别人写的内容那就失去写作的意义了. 类加载器结构 类加载器结构 名称解释: 根类加载器,也叫引导类加载器.启动类加载器.由于它不属于Java类库,这里就不说它对应的类名了,很多人喜

深入探讨Java类加载器

类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一. 它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的.Java Applet 需要从远程下载 Java 类文件到浏览器中并执行.现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用.一般来说,Java 应用的开发人员不需要直接同类加 载器进行交互.Java 虚拟机默认的行为就已经足够满足大多数情况的需求

Java 类加载器(转)

 java虚拟机中可以安装多个类加载,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap(内嵌在java虚拟机中由C++编写),ExtClassLoader,AppClassLoad    类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap.    java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象    或

java类加载器-关于java类加载的双亲委托机制的一点疑问

问题描述 关于java类加载的双亲委托机制的一点疑问 class Clazz2{ public static void main(String[] args) { ClassLoader classLoader = new ClassLoader() { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try { FileInputStream fileInputStream =

Java类加载器学习2——自定义类加载器和父类委托机制带来的问题

  一.自定义类加载器的一般步骤   Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载器.如果父类加载器加载不了,依次再使用其子类进行加载.当然这类所说的父类加载器,不一定他们之间是继承的关系,有可能仅仅是包装的关系.   Java之所以出现这条机制,因为是处于安全性考虑.害怕用户自己定义class文件然后自己写一个类加载器来加载原本应该是JVM自己加载的类.这样会是JVM虚

Java类加载器(二)——自定义类加载器

  用户定制自己的ClassLoader可以实现以下的一些应用: 自定义路径下查找自定义的class类文件,也许我们需要的class文件并不总是在已经设置好的Classpath下面,那么我们必须想办法来找到这个类,在这种清理下我们需要自己实现一个ClassLoader. 确保安全性:Java字节码很容易被反编译,对我们自己的要加载的类做特殊处理,如保证通过网络传输的类的安全性,可以将类经过加密后再传输,在加密到JVM之前需要对类的字节码在解密,这个过程就可以在自定义的ClassLoader中实现

Java类加载器(一)——类加载器层次与模型

类加载器   虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为"类加载器". 类加载器层次(等级)   从JVM的角度来讲,只存在两种不同的类加载器.   第一类是启动类加载器(Bootstrap ClassLoader):这个类加载器主要加载JVM自身工作需要的类.这个类加载器由C++语言实现(特指HotSpot),是虚拟机

Java类加载器学习1——类加载器的基本概念

  一.程序使用java类的运行顺序   当程序主动使用某个类的时候,若该类还未被加载至内存中,系统会通过加载,连接,初始化三个步骤对类进行初始化,有事也把这三个步骤称为类加载或者类的初始化.   1 类的加载 将被编译的.java而成为.class字节码读入JVM内存并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类的时候系统都会为之建立一个java.lang.Class对象.类的加载由类加载器完成,类加载器通常有JVM提供,我们称JVM提供的类加载器为系统类加载器.

Java类加载器以及类加载器的委托模型

我们知道,我们在Java中用到的所有的类都是通过类加载器ClassLoader加载到JVM中的,我们还知道类加载器也对应着一个类,既然这样那么我们会想那么ClassLoader类是由谁加载的呢? 其实在Java中有许许多多的类加载器,我们甚至可以写自己的类加载器. 其中主要三个类加载器(他们是树形关系)是: BootStrap:在java虚拟机启动的时候会利用这个类加载器来加载 JDK安装目录下的 /JRE/LIB/rt.jar 也就是系统默认导入的一些类例如System类,这个类加载器不是类