分享
 
 
 

Class Loading ---(类装载机制,开发者不得不知道的故事) --上篇

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

也许你认为Class Load是一个高级话题,不管怎样,作为开发者你还是要了解它。

本文基于最新得JDK5,然后将将诉的内容都包含了最基本的原理,希望你能更加深入了解自己所使用得语言。

理解CLassLoader

如果你自己定义叻一个 org.test.Object 。

你在程序中这样写:

import ort.test.Object

Object o = new String();

也许你欣然以为这样写没问题,但实际上你错了。

这样是不正确的,会报 ClassCastException,

一个Class在JVM中得标识呢是由它得 PackAge 和 类名决定得。 也就是它得名称空间。

org.test.Object 可不是 java.lang.Object

在java中呢,每个类都是java.lang.Class得实例。也就是说。

java.lang.Class klass = Myclass.class;

Myclass myclass = new Myclass() 等同于 myclass.newInstance();

在JVM中。所有得类都由 java.lang.ClassLoader.(或者是它得子类开发者自己添加得),我们在启动得时候都是借力于JAVA_HOME/jre/rt.jar。 不过我们发现JDK这里并没有任何文档介绍bootstrap.jar。 实际上bootstrap Class Loader是JDK之外得,它得方式和JVM的是不一样的。(本文不做介绍)

java.net.URLClassLoader java.security.SecureClassLoader java.rmi.server.RMIClassLoader sun.applet.AppletClassLoader Class Loaders工作原理

除了bootstrap之外,所有的Classloader都有个父类Class Loader ,他们都是instanceof java.lang.ClassLoader

来看看JDK1.5中的工作原理。

假如有个方法loadClass

protected synchronized Class<?> loadClass

(String name, boolean resolve)

throws ClassNotFoundException{

// First check if the class is already loaded

Class c = findLoadedClass(name);

if (c == null) {

try {

if (parent != null) {

c = parent.loadClass(name, false);

} else {

c = findBootstrapClass0(name);

}

} catch (ClassNotFoundException e) {

// If still not found, then invoke

// findClass to find the class.

c = findClass(name);

}

}

if (resolve) {

resolveClass(c);

}

return c;

}

那么Set它父类的方式有两种。

public class MyClassLoader extends ClassLoader{

public MyClassLoader(){

super(MyClassLoader.class.getClassLoader());

}

}

或者

public class MyClassLoader extends ClassLoader{

public MyClassLoader(){

super(getClass().getClassLoader());

}

}

这里是首选第一种。

因为getClass()是在构造函数内部得方法,所以必须要有构造函数代码存在,但是如果不存在,那就找父类得classloader 一直找啊找,直至找到到findBootstrapClass, 如果它也不存在得话,那时候findClass()方法会被调用执行。。到那时候会报一个ClassNotFoundException。

来看看findClass()得代码

protected Class<?> findClass(String name)

throws ClassNotFoundException {

throw new ClassNotFoundException(name);

}

在findClass() 方法内 class loader要取得到得字节码(就是.class文件里得内容),然而不不一定就是.class文件, 这些字节码可以来自本地,也可以是系统,网络(借着这个你可以理解一下Cobra,RMI),也可以是用BCEL(Apache一个基于字节码得一个引擎库) ...等等。 一但字节码找到了。那时候就开始执行defineClass()方法。那时候会定义出一个类的实例来。

如果有两个ClassLoader 实例化两个相同得代码,defineClass()定义得两个类也是不同得。详细请看(Java language specification

protected Class<?> findClass(String name)

throws ClassNotFoundException {

throw new ClassNotFoundException(name);

}

在findClass() 方法内 class loader要取得到得字节码(就是.class文件里得内容),然而不不一定就是.class文件, 这些字节码可以来自本地,也可以是系统,网络(借着这个你可以理解一下Cobra,RMI),也可以是用BCEL(Apache一个基于字节码得一个引擎库) ...等等。 一但字节码找到了。那时候就开始执行defineClass()方法。那时候会定义出一个类的实例来。

如果有两个ClassLoader 实例化两个相同得代码,defineClass()定义得两个类也是不同得。详细请看(Java language specification

下图展示了一个MyMainclass.class如何装载执行。(由多个classLoader加载同一个Target.class),----和我们想象中有差别得是,它首先是由于BootStarpClassLoader载入得。

根据上面得解析,既然两个classLoader()载入Target.class得字节码 ,那defineClass()就会产品两个class得定义得。

所以很容易得出结论Target target3 = (Target) target2; 是不能被执行地。

具体请看Inside Class Loaders(Andreas Schaefer)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有