<%@ page contentType="text/html; charset=gb2312"%> 类加载器
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
类加载器
     发布者: 发布时间:2007-04-11
看了王森的《JAVA深度历险》,做了一个简单的学习笔记。
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. }  

3  类加载器的层次
                                           
未命名.PNG
 描述:  
 文件大小:  13 KB
 看过的:  文件被下载或查看 789 次

未命名.PNG
下载

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
JBoss下数据源密码加密
应用Java技术开发WAP应用程序
新一代网络模式Web 2.0火爆发展
IBM推新品服务 扩展SOA管理概念
AJAX 框架DWR 2.0 M1 发布
详谈基于JSON的高级AJAX开发技术
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(5287)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(1232)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(468)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(1795)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号