今天就跟大家聊聊有关Class.forName和classloader加载类有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、类加载机制往细了看大致分为5个阶段:(1)加载:java类运行时候会生成一个class字节码文件,加载的过程就是去我们的操作系统寻找这个class文件。(2)链接:这个过程就是把class文件加载到java虚拟机。(3)初始化:在虚拟机中根据class文件进行初始化。(4)使用:这个过程大家都明白。(5)卸载:使用完了,java虚拟机进行清理。对于class.forName和classloader来说针对的就是第一个过程,也就是加载过程。不过这俩虽然有一定的相似性,但是区别还是挺大的。二 分析 Class.forName()和ClassLoader.loadClass我们使用代码,先看看如何使用。注意包的范围,避免加载不了。第一步:定义User类第二步:测试我们在上面的test方法中,使用了两个加载方法。现在我们测试一下:是不感觉有点区别。现在是先给出一个大体的使用,下面我们分析一下他们的区别。二、区别1、class.forNameclass.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。注意这里的静态块指的是在类初始化时的一些数据。但是classloader却没有,想要弄清楚这个原因,还是直接到源码中看看。在这个源码中我们会发现,其实底层真正实现的是forName0方法,那这几个参数又是什么意思呢?(1)className:表示我们要加载的类名(2)true:指Class被加载后是不是必须被初始化。 不初始化就是不执行static的代码即静态代码,在这里默认为true,也就是默认实现类的初始化。(3)ClassLoader.getClassLoader(caller):表示类加载器,到这你会发现forNanme其实也是使用的ClassLoader类加载器加载的。(4)caller:指定类加载器。2、classloader在上面的案例中我们发现,classloader并没有初始化静态块,原因最好还是到源码中看。首先我们先进入到loadclass方法中的源码。这一步看起来还看不明白,没关系这里真正实现的是内部的loadclass,我们再跟进去看看。这个才是真正实现的方法,在这里的步骤其实很简单,大致流程是先判断class是否已经被加载,如果被加载了那就重新加载,如果没有加载那就使用双亲委派原则加载。加载的时候并没有指定是否要进行初始化。所以现在他们的区别基本上很少,总结一下:(1)class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。(2)classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。三数据库链接为什么使用Class.forName(className)看完上述内容,你们对Class.forName和classloader加载类有 香港云主机什么不同有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注开发云行业资讯频道,感谢大家的支持。
相关推荐: Hadoop学习–通过API访问本地文件系统–day04
import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.URL;import org.apache.hadoop.conf.Configuration;im…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。