已锁定 主题:[笔记]类加载器
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-04
1. JAVA类装载器在装载类的时候是按需加载的,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这 个类并初始化。 类Main: java 代码
类A: java 代码
类B: java 代码
执行:java -varbose:class Main 执行结果: E:\DEV>java -verbose:class Main [Opened C:\Program Files\Java\jre1.5.0_11\lib\rt.jar] (类装载器会首先加载rt.jar加载基础类) . . [Loaded Main from file:/E:/DEV/] (类装载器载入相应类并初始化) [Loaded A from file:/E:/DEV/] Using Class A [Loaded B from file:/E:/DEV/] Using Class B 2. 让JAVA程序具有动态性 使用显式方式来实现动态性,我们需要自己动手处理类载入时的细节部分。 两种方法: | +-- 隐式的 : 使用new关键字让类加载器按需求载入所需的类 | +-- 显式的 : | +-- 由 java.lang.Class的forName()方法加载 | +-- 由 java.lang.ClassLoader的loadClass()方法加载 (1) 使用Class.forName() Class.forName()方法具有两个重载的方法: +- public static Class forName(String className) | +- public static Class forName(String className, boolean initialize,ClassLoader loader) 参数说明: className - 所需类的完全限定名 initialize - 是否必须初始化类(静态代码块的初始化) loader - 用于加载类的类加载器 调用只有一个参数的forName()方法等效于 Class.forName(className, true, loader)。 这两个方法,最后都要连接到原生方法forName0(),其定义如下: private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException; 只有一个参数的forName()方法,最后调用的是: forName0(className, true, ClassLoader.getCallerClassLoader()); 而三个参数的forName(),最后调用的是: forName0(name, initialize, loader); 所以,不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了“载入类 + 运行静态代码块”的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。 (2) 直接使用类加载器 +— 获得对象所属的类 : getClass()方法 | +— 获得该类的类加载器 : getClassLoader()方法 java 代码
3 类加载器的层次 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-05
顶一个,最近也在看这方面的知识
|
|
返回顶楼 | |
发表时间:2007-04-05
模式 , 不会也得看, 说不上 哪天就开窍了!
|
|
返回顶楼 | |
发表时间:2007-04-05
受教了,说起类加载,我想问一下,我要是把一个动态库打包在jar中,好像无法加载,但是在Eclipse中,swt的动态库都是放在jar包中的呀,请各位大侠多指教。
|
|
返回顶楼 | |
发表时间:2007-04-05
twjava 写道 受教了,说起类加载,我想问一下,我要是把一个动态库打包在jar中,好像无法加载,但是在Eclipse中,swt的动态库都是放在jar包中的呀,请各位大侠多指教。
我们可以通过java.net.URLClassLoader这个类构建一个自己的类加载器,来载入自己所需要的类。 下面是JDK中的说明: public class URLClassLoader extends SecureClassLoader 该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。这里假定任何以 '/' 结束的 URL 都是指向目录的。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件。 |
|
返回顶楼 | |
发表时间:2007-04-06
不错的,最近正在看“java反射”的东东
|
|
返回顶楼 | |
发表时间:2007-04-09
很好啊 ,描述的简单明了,例子也很能说明问题
|
|
返回顶楼 | |
发表时间:2007-04-09
能不能举个实际项目中的例子来说明它的用法和作用啊?
|
|
返回顶楼 | |
发表时间:2007-04-10
收藏先
|
|
返回顶楼 | |
发表时间:2007-04-10
正在学习中
|
|
返回顶楼 | |