问八:说说loadClass和forName的区别?

源代码解析:

ClassLoader.loadClass

首先是ClassLoader的loadClass(String class_name, boolean resolve)方法,传入了一个resolve的boolean类型

如果为true,则执行resolveClass方法,这个方法的作用是

即链接指定class,但是实际上在调用这个方法之前,就已经传入了它的默认值

 

因此ClassLoader.loadClass是不会链接class的

 

Class.forName

由源代码可以看出,当调用forName的时候,java会默认执行初始化工作,得到初始化完成后的class

 

 

回答:

Class.forName得到的class是已经初始化完成的,即执行了静态代码块的

ClassLoader.loadClass得到的class是还未进行链接处理的

 

示例代码:

public class Person {

    static {

         System.out.println("test 666");

    }

}
public class Laod {

    public static void main(String[] args) throws  Exception {

         ClassLoader aclassLoader =  Laod.class.getClassLoader();

         aclassLoader.loadClass("com.liu.socket.Person");

//       Class<Laod> forName = (Class<Laod>)  Class.forName("com.liu.socket.Person");

    }

}

说一说它们这些特点的作用?

就拿com.mysql.jdbc.Driver来说,如果使用loadClass的话,就不能够创建它的对象,因为在其源代码中,有一段这样的静态代码: 

   static {

        try {

            java.sql.DriverManager.registerDriver(new  Driver());

        } catch (SQLException E) {

            throw new RuntimeException("Can't register  driver!");

        }

    }

需要使用forName来进行初始化驱动

 

ClassLoader.loadClass可以使用在Spring IOC的延迟加载机制中,SpringIOC为了加快初始化速度,大量采用了懒加载(延迟加载)技术,等使用到的时候在初始化对象

 

全部评论

相关推荐

不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
06-26 19:47
中南大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务