Atitti 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new

原创 2017年01月02日 21:00:19

Atitti 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new 

 

1.1. 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new 1

1.2. 获得ClassLoader的几种方法可以通过如下3种方法得到ClassLoader 2

1.3. 1和2和3究竟有什么区别呢?分别用于什么情况呢? 2

1.4. jvm有严格的规定(五种情况):2

1.5. 对象实例化4方式: 3

 

1.1. 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new 

 

对于载入类的情况,用户需要知道B类的完整名字(包括包名,例如"com.rain.B")  
1. 使用Class静态方法 Class.forName  

    Class cls = Class.forName("com.rain.B"); 
    B b = (B)cls.newInstance(); 

通过反射加载类型,并创建对象实例 
如果无法找到Dog,则抛出ClassNotFoundException

2. 使用ClassLoader  
    /* Step 1. Get ClassLoader */ 
    ClassLoader cl; // 如何获得ClassLoader参考1.6 

    /* Step 2. Load the class */ 
    Class cls = cl.loadClass("com.rain.B"); // 使用第一步得到的ClassLoader来载入B 
     
    /* Step 3. new instance */ 
    B b = (B)cls.newInstance(); // 有B的类得到一个B的实例 

 

通过反射加载类型,并创建对象实例 
如果无法找到Dog,则抛出ClassNotFoundException。 

3. 直接new  
    B b = new B(); 

 

这个动作会导致常量池的解析,Dog类被隐式装载。 
如果当前ClassLoader无法找到Dog,则抛出NoClassDefFoundError。 

 

 

1.2. 获得ClassLoader的几种方法可以通过如下3种方法得到ClassLoader 

 
this.getClass.getClassLoader(); // 使用当前类的ClassLoader  
Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader  
ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。

 

 

 

1.3. 1和2和3究竟有什么区别呢?分别用于什么情况呢? 



1和2使用的类加载器是相同的,都是当前类加载器。(即:this.getClass.getClassLoader)。 
3由用户指定类加载器。 

如果需要在当前类路径以外寻找类,则只能采用第3种方式。第3种方式加载的类与当前类分属不同的命名空间。 
当前类加载器命名空间对其不可见。当然,如果被加载类的超类对于当前类命名空间可见的话,则可以进行强

 

 

 

1.4. jvm有严格的规定(五种情况):

1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,假如类还没进行初始化,则马上对其进行初始化工作。其实就是3种情况:用new实例化一个类时、读取或者设置类的静态字段时(不包括被final修饰的静态字段,因为他们已经被塞进常量池了)、以及执行静态方法的时候。

2.使用java.lang.reflect.*的方法对类进行反射调用的时候,如果类还没有进行过初始化,马上对其进行。

3.初始化一个类的时候,如果他的父亲还没有被初始化,则先去初始化其父亲。

4.当jvm启动时,用户需要指定一个要执行的主类(包含static void main(String[] args)的那个类),则jvm会先去初始化这个类。

5.用Class.forName(String className);来加载类的时候,也会执行初始化动作。注意:ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化。

以上5种预处理称为对一个类进行主动的引用,其余的其他情况,称为被动引用,都不会触发类的初始化。

 

1.5. 对象实例化4方式: 


1、new Dog(); 
2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...); 
3、Object.clone();//通过本地方法进行复制 
4、反序列化  

 

 

 

 

java 载入类的三种方法 - Flyer的后花园 - 博客频道 - CSDN.NET.html

几种类加载方式的区别 - hengfanz的专栏 - 博客频道 - CSDN.NET.html

 

 

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender Of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon bin adam Al Rapanui 埃米尔 阿提拉克斯 阿克巴 马哈茂德  阿提拉 所罗门 本亚当  阿尔 拉帕努伊

常用名:艾提拉(艾龙),  EMAIL:1466519819@qq.com

 

 

头衔:uke总部o2o负责人,全球网格化项目创始人,

uke宗教与文化融合事务部部长, uke宗教改革委员会副主席

Uke部落首席大酋长,

uke制度与重大会议委员会委员长,uke保安部首席大队长,uke制度检查委员会副会长,

奶牛科技cto ,uke 首席cto  技术总监 研发总监 研发主管 部门总监

uke波利尼西亚区大区连锁负责人 汤加王国区域负责人。

uke克尔格伦群岛区连锁负责人,莱恩群岛区连锁负责人,

uke布维岛和南乔治亚和南桑威奇群岛大区连锁负责人

 Uke软件标准化协会理事长理事长 Uke 数据库与存储标准化协会副会长

uke出版社编辑总编

uke终身教育学校副校长  Uke医院 与医学院方面的创始人 度假村首席大村长

 

转载请注明来源:attilax的专栏  ?http://blog.csdn.net/attilax

--Atiend

 

 

java反射中,Class.forName和classloader的区别(代码说话)

java中class.forName()和classLoader都可用来对类进行加载。 class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的st...
  • qq_27093465
  • qq_27093465
  • 2016年08月20日 17:14
  • 14827

java连接数据库时加载驱动程序Class.forName(driveName)详解

java连接数据库时加载驱动程序Class.forName(driveName)详解
  • VipMao
  • VipMao
  • 2016年04月05日 19:53
  • 5847

jdbc加载驱动 Class.forName()的作用

在学习jdbc时,我们首先学到的是最简单的helloWorld入门,但是为什么要这样呢 ? //注册驱动 Class.forName("com.mysql.jd...
  • u010644448
  • u010644448
  • 2016年07月12日 23:05
  • 3180

Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案

Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案   1.1. 七、什么是贝叶斯过滤器?1 1.2. 八、建立历史资料库2 1.3. 十、联合概率的计...
  • attilax
  • attilax
  • 2016年10月23日 02:12
  • 378

Atitti  onvif 设备发现与原理

Atitti  onvif 设备发现与原理   1.1. ,有以下几个步骤:1 1.2. 设备搜索原理及编程技巧:2 1.3. Ws disconvert 的组播地址和端口就是3...
  • attilax
  • attilax
  • 2016年12月14日 23:12
  • 663

DrawInRect 方法的使用:重绘文字;图片;画线;画图

  • 2015年12月15日 17:44
  • 155KB
  • 下载

 破解charles 4.1的方法

  • 2017年05月15日 10:51
  • 3.47MB
  • 下载

[Objective-C] 类、对象和方法

面向对象的重要概念即 是你想对对象做的事情。   C语言中通常是考虑做什么,然后关注对象。而面向对象的语言则是:你有一辆汽车,它就是你的对象,你的汽车是汽车的实例。 即 Car类创造了对象yourCa...
  • qq_27315135
  • qq_27315135
  • 2015年05月30日 14:22
  • 406

4.7.6  使用 new 来创建动态数组

使用常规数组存储数据时,一般都是在程序编译时就已经为数组分配好了内存。如果存储的数据未达到数组的长度,就会导致很多内存闲置,致使效率较低。 对于处理一些大型数据,我们就可以使用 new 进行动态内存...
  • nce16220811
  • nce16220811
  • 2015年06月07日 23:19
  • 380

将web项目发布到Tomcat 服务器上的三种方法

Java Web开发Tomcat中三种部署项目的方法,开始java web开发必不可少的步骤,经过查找,觉得有篇文章介绍的不错 第一种方法:在tomcat中的conf目录中,在server.xml中...
  • KevinwuwenboA
  • KevinwuwenboA
  • 2016年10月22日 23:23
  • 15182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Atitti 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new
举报原因:
原因补充:

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