Class, Classloader与字节码

試著忘記壹切 提交于 2020-04-07 03:51:37

Class是对方法区(字节码)数据的倒排索引。是一种查找手段。

没有class,就没有办法对方法区进行快速索引。

java里面所有的类型包括枚举,注解,数组类型,原始类型,void等都是class。足以说明class对象有多重要。说明所有的操作都用到class或通过class实现的。

朔class是类的信息,还不如说class是类的运行时信息。你想,每次VM可能把一个真正的class放在任何地方,这个不确定性,就构成“信息”。

classloader的工作范围截止在class loading。名符其实。

class loading意味着装载就完事。装载意即:就像装入一个文件到内存-就是完成一个从IO到内存的复制。复制完以后需要把地址信息记下来。这些信息就是Class。

所以真正的Class与类并没有关系,而是关于运行时的信息。就是,类被装在了哪里,方法被装在了哪里。或者说,Class更多的是关于方法或类级的信息。因为域的意义在对象里,跟Class没什么关系。

关于classloader的边界或安全性,主要在于隔离并定义加载能力。

隔离加载能力好像不能对类安全有什么帮助,因为方法区没有隔离。可以通过直接访问方法区得到类数据(从而得到Class对象)。为什么还要隔离?

因为java语言不能访问内存。

因此说类加载器是防君子不防小人,防java不防本地代码。

但是本地代码可以被java permission关掉。

代理加载:

代理加载意思不是代理加载因为事实上一个classloader并不能控制另一个classloader。代理加载的意思是加载能力的代理。或者说反过来叫加载代理。这个是语言上的误解。

比如,多次delegation并不会产生多次加载,但是却会产生多次Class对象的返回。所以关于类加载最重要的不是类的加载。而是Class对象数据流。

类的安全完全是建立在对这个数据流(class对象或者说类-运行时-信息)的控制上。

你得不到一个class,就不可能访问这个class或者执行这个class。关于这个class的一切就都与你无关。注意多个classloader可能load同一个class,这种情况下它们就不是同一个class。因为我们现在讨论的是在《class,package,classloader》三元组定义下的class。

意思:你加载了这个class,它才是你的“class”。你才有一个“class”。

意思还是运行时的“class”。

这个”class”与我们用源语言写出来的class不是一个class。

我们写出来的class在我们脑中,而运行时的“class”在内存(方法区)中,是一个具体的class。一个在方法区中的class,必须有一个classloader因为它必须被哪个classloader装进来然后才可能有它。

所以,一定要区分抽象的class与运行时class。比如,本文标题中class,classloader中的class就不是一个class。class中的class是运行时的,而classloader中的class是抽象的class。两个class都是字节码,但是只有第一个class是与运行时有关的。

换句话说,还是索引。就是索引。还不如叫索引。因为java是动态链接的,所以必须有索引。




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!