网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java类加载的表现形式     
  文章作者:未知  文章来源:水木森林  
  查看:82次  录入:管理员--2007-11-17  
 

   java中的类是动态加载的,我们先看一下我们常用的类加载方式,先有一个感性的认识,才能进一步
深入讨论,类加载无非就是下面三种方式。
class a{}
class b{}
class c{}
public class loader{
    public static void main(string[] args) throws exception{
       class aa=a.class;
       class bb=class.forname("b");
       class cc=classloader.getsystemclassloader().loadclass("c");
    }
}

我们先看.class字面量方式,很多人可能不知道这种方式,因为这种用法不是一般java语法。
通过javap我们可以发现,这种方式的大致等价于定义了一个静态成员变量
    static class class$0;(后面的编号是增长的)
你可以试图再定义一个  static class class$0,应该会收到一个编译错误(重复定义)。
class aa=a.class;
就相当于

    if(class$0==null){
 try{
           class.forname("a");
 }
 cacth(classnotfoundexception e){
    throw new noclassdeffounderror(e);
 }
    }
    class aa=class$0;
    可以很清楚的看到,这种类的字面量定义其实不是加载类的方式,而是被编译器处理了,实质上是使用了class.forname方法,但是使用这种方式有一个很大的好处就是不用处理异常,因为编译器处理的时候如果找不到类会抛出一个noclassdeffounderror.也许你觉得需要处理classnotfoundexception这种异常,事实上99%的情况下我们可以把这种异常认为是一个错误。
    所以大部分情况我们使用这种方式会更简洁。
    最常用的方式就是class.forname方式了,这也是一个通用的上层调用。这个方法有两个重载,可能很多人都忽略了第二个方法。
public static class forname(string name) throws classnotfoundexception
public static class forname(string name, boolean initialize,classloader loader) throws classnotfoundexception
第二个方法后面多了两个参数,第二个参数表示是否初始化,第三个参数为指定的类加载器。
在上面的例子中:
class bb=class.forname("b");
等价于
class bb=class.forname("b",true,loader.class.getclassloader());
    这里要详细说一下这个类的初始化这个参数,如果这个参数为false的话,类中的static成员不会被初始化,static语句块也不会被执行。
    也就是类虽然被加载了,但是没有被初始化,不过在第一次使用时仍然会初始化。
    所以我们有时候会看到class.forname("xxx")。newinstance()这样的语句,为什么这里要创建一个不用的实例呢?不过是为了保证类被初始化(兼容以前的系统)。
    其实第二个方法是比较难用的,需要指定类加载器,如果不指定而且又没有安装安全管理器的化,是无法加载类的,只要看一下具体的实现就明白了。
    最本质的方式当然是直接使用classloader加载了,所有的类最终都是通过classloader加载的,class cc=classloader.getsystemclassloader()。loadclass("c");这里通过使用系统类加载器来加载某个类,很直接的方式,但是很遗憾的是通过这种方式加载类,类是没有被初始化的(也就是初始化被延迟到真正使用的时候)。不过我们也可以借鉴上面的经验,加载后实例化一个对象class cc=classloader.getsystemclassloader()。loadclass("c")。newinstance()。
    这里使用了系统类加载器,也是最常用的类加载器,从classpath中寻找要加载的类。
    java中默认有三种类加载器:引导类加载器,扩展类加载器,系统类加载器。
    java中的类加载有着规范的层次结构,如果我们要了解类加载的过程,需要明确知道哪个类被谁加载,某个类加载器加载了哪些类等等,就需要深入理解classloader的本质。
    以上只是类加载的表面的东西,我们还将讨论深层次的东西。
 
 
上一篇: java入门:缓冲区溢出编程心得    下一篇: java 学习方法浅谈
  相关文档
高级编程:三重des加密程序 11-17
java 基本语法(一)——数据类型 11-17
jsp文件上传体会(采用javabean上传) 11-17
基础篇:循环 11-17
用pmd自动执行java代码静态分析 11-16
hibernate+spring+struts扩展struts 11-17
实际java编程中的经验教训 11-17
进阶教程——java性能优化通用篇 11-17
getfileversion 方法 11-16
eclispe下开发struts完整解决乱码问题 01-09
初学者入门--structs中基本配置入门 01-31
用javabean实现文件上载(2) 11-17
scjp认证套题解析之二 11-16
使用jdbc和hibernate来写入blob型数据 11-17
共享内存在java中的实现和应用 11-17
分析和设计 11-17
构建用于正则表达式的抽象 java api 11-16
精通ejb【七】 11-17
在eclipse中使用hibernate一(组图) 11-17
jsf与web完美应用组合 高度提升开发效率 06-11
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息