类加载器相关

原创 2007年09月27日 19:43:00
1. JAVA类装载器在装载类的时候是按需加载的,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这 个类并初始化。
     类Main:
    
java 代码
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.          A a = new A();  
  4.          a.print();  
  5.          B b = new B();  
  6.          b.print();  
  7.      }  
  8. }  
   
   类A:
java 代码
  1. public class A   {  
  2.     public void print() {  
  3.          System.out.println("Using Class A");  
  4.      }  
  5. }  

类B:
java 代码
  1. public class B {  
  2.     public void print() {  
  3.          System.out.println("Using Class B");  
  4.      }  
  5. }  

执行: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 代码
  1. public class Main3 {  
  2.     public static void main(String[] args) throws Exception {  
  3.          Main3 main3 = new Main3();  
  4.          System.out.println("准备载入类");  
  5.          ClassLoader loader = main3.getClass().getClassLoader();  
  6.          Class clazzA = loader.loadClass(args[0]);  
  7.          System.out.println("实例化类A");  
  8.          A o1 = (A) clazzA.newInstance();          
  9.      }  
  10. }  
 

Java类加载器 ClassLoader的解析

Java类加载器 ClassLoader的解析
  • xinyuan_java
  • xinyuan_java
  • 2016年04月21日 10:13
  • 1662

Java线程上下文类加载器

1 线程上下文类加载器   线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextC...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2015年01月09日 00:01
  • 1465

不同classloader装载的类不能互相访问?

一,有两个术语,一个叫“定义类加载器”,一个叫“初始类加载器”。 比如有如下的类加载器结构: bootstrap   ExtClassloader     AppClassloader   ...
  • yongche_shi
  • yongche_shi
  • 2014年09月30日 14:49
  • 1344

配置文件+类加载器(单例模式)连接数据库

  • 2012年11月18日 12:55
  • 4KB
  • 下载

类加载器文件

  • 2015年10月02日 16:04
  • 17KB
  • 下载

类加载器(java)

  • 2014年02月26日 18:01
  • 26KB
  • 下载

java 静态代码块通过类加载器获取资源文件例子

  • 2015年02月10日 14:22
  • 1KB
  • 下载

18.类加载器.doc

  • 2011年08月30日 22:34
  • 1.32MB
  • 下载

java class loader(JAVA类加载器)

  • 2012年02月23日 10:24
  • 2.37MB
  • 下载

RAD类加载器序列

  • 2012年09月15日 03:23
  • 79KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类加载器相关
举报原因:
原因补充:

(最多只允许输入30个字)