`

Class.forName与ClassLoader区别

    博客分类:
  • JVM
阅读更多

Class 用来描述一个类型,当一个类型被装载(虚拟机读取二进制的class文件)的时候,会创建一个与该类型对应的Class对象到内存堆中。(这个时候该类型甚至没有被分配内存,设置默认值,更别说初始化了)。
Class.forName有2个重载的方法:

    public static Class<?> forName(String name, boolean initialize,  
                   ClassLoader loader)  
           throws ClassNotFoundException  
      
      
    public static Class<?> forName(String className)   
                   throws ClassNotFoundException  

 第一个方法:
name:类的全限定名,如:com.aaa.bbb.ccc
initialize:如果为true,则会在返回Class对象之前,对该类型做连接,校验,初始化操作。(如:执行static块中的代码)
loader:用自定义的类加载器来请求这个类型;当然,你也可以传入null,用bootstrap加载器。
第二个方法:
name和上面相同。默认initialize为true,
而loader是这么获取的

ClassLoader.getCallerClassLoader()

 其实就是获取当前类的classLoader,也就是装载执行forName操作的类的classLoader

类ClassLoader包括2个重载的loadClass类

protected synchronized Class<?> loadClass(String name, boolean resolve)  
    throws ClassNotFoundException  
  
public Class<?> loadClass(String name) throws ClassNotFoundException

 两个方法都需要传name,既类的全限定名作为参数。
resolve:表示是否需要连接该类型。
注意:是连接(这里面包括校验class文件,准备分配内存,类型常量池的替换),并不会初始化该类型。

 

都说清楚了,也很容易区分出不同点:
1.Class.forName返回的Class对象可以决定是否初始化。而ClassLoader.loadClass返回的类型绝对不会初始化,最多只会做连接操作。
2.Class.forName可以决定由哪个classLoader来请求这个类型。而ClassLoader.loadClass是用当前的classLoader去请求。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

    在Java的反射中,Class.forName和Class

    在Java的反射中,Class.forName和ClassLoader的区别共4页.pdf.zip

    jdbc--sqljdbc4-2.0.jar

    java链接sqlserver数据库包如下错误时: ... at java.net.URLClassLoader.findClass(Unknown ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-2.0包即可

    在可执行jar中载入第三方jar的几个解决方法

    开发完毕,部署的时候,将开发的class打成一个可执行jar包,会发现通过Class.forName(String classname) 或ClassLoader.getSystemClassLoader().loadClass(String classname)来动态载入存在于第三方jar包中的class会抛...

    hive-jdbc-2.1.0-standalone.jar

    at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more

    hive-jdbc-1.1.0-cdh5.4.5-standalone.jar

    at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more

    大数据面试题.pdf

    52 1-12)Java中Class.forName和ClassLoader.loadClass的区别 Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第⼆个参数(bool)表⽰装载类的时候是否 初始化该类,即...

    疯狂java讲义

    疯狂java讲义 源代码** * Description: ... * Program Name: * Date: ... * @version 1.0 */ class Tester ... System.out.println("Tester类的静态初始化块...");... Class.forName("Tester"); } }

    Java 基础面试题

    该文档主要整理了常见的Java基础面试题,包含以下内容: ...32. Class.forName()和ClassLoader.loadClass()的区别 34. 如何防止创建的类名不能java为已有类名,Java加载双亲委派机制 35. 堆和栈的区别

    algorithm-study:你好,世界

    :green_apple: :red_apple: ...反射中,Class.forName和ClassLoader区别 。 java动态代理实现与原理详细分析 描述动态代理的几种实现方式,分别说出相应的优缺点。 动态代理与cglib实现的区别。 为什么CGlib

    基于javatcpsocket通信的拆包和装包源码-someData:存放一些思维导图,图片,ppt等等

    基于java tcp socket通信的拆包和装包源码 ...反射中,Class.forName和ClassLoader区别 动态代理的几种实现方式,对应的优缺点 动态代理与cglib实现的区别 为什么CGlib方式可以对接口实现代理 序列化,

    sarras:通过Java应用程序的静态和动态分析为Graal基板VM反射配置文件生成器

    作为Java代理附加到常规Java应用程序(不是来自本机映像),并拦截反射调用(还包括Class.forName(...)和ClassLoader.loadClass(...)调用)。 因此,它可以在运行时收集有关通过反射访问/引用哪些类/方法/字段的信息...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    java8源码-java_architect:java_架构师

    反射中,Class.forName和classloader的区别? session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。 Java中的队列都有哪些,有什么区别。 Java的内存模型以及GC算法 Java8的新特性 Java...

    java + 动态代理 + 动态代理实际应用场景

    1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic...4: 动态代理使用到基础理论:Class.forName("xxxx") 得到Class类 。

    day021-反射和注解笔记和代码.rar

    1.2 static 类&lt;?&gt; forName(String name, boolean initialize, ClassLoader loader) name:全限定路径名 initialize:表示是否初始化,默认是false loader:可以指定一个类加载器加载...

    带注释的Bootstrap.java

    private ClassLoader createClassLoader(String name, ClassLoader parent) throws Exception { //CatalinaProperties解析$CATALINA_HOME\conf\catalina.properties, //并将catalina.properties内的属性存为...

    spring-boot-reference.pdf

    Customizing the Restart Classloader 20.2.7. Known Limitations 20.3. LiveReload 20.4. Global Settings 20.5. Remote Applications 20.5.1. Running the Remote Client Application 20.5.2. Remote Update 21. ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【反射】反射中,Class.forName和classloader的区别 42 【JVM】JAVA编译原理和JVM原理 42 【JVM】Java内存模型 44 【JVM】jvm内存模型 45 主内存与工作内存 45 内存间交互操作 46 重排序 48 【JVM】内存泄漏 49 ...

Global site tag (gtag.js) - Google Analytics