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

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

 

 

posted @ 2017-01-02 21:00  attilaxAti  阅读(29)  评论(0编辑  收藏  举报