张帅
侠客
侠客
  • UID323
  • 粉丝0
  • 关注0
  • 发帖数8
阅读:6026回复:4

反射应用中的ClassLoader.loadClass和Class.forName的区别

楼主#
更多 发布于:2019-03-26 20:20
  1. 首先需要了解JAVA类装在的过程:

  • 装载类--->验证--->准备--->解析--->初始化--->使用--->卸载

                          (----------链接----------)
  • 装载:通过类的全限定名获取二进制字节流,将二进制字节流转换成方法中的运行时数据结构,在内存中生成Java.lang.class对象。
  • 链接:
  • 校验:检查导入类或者接口的二进制数据的正确性;(文件格式验证、元数据验证、字节码验证、符号引用验证)。
  • 准备:给类的静态变量分配并初始化存储空间。
  • 解析:将常量池中的符号引用转成直接引用。
初始化:激活类的静态变量的初始化JAVA代码和静态JAVA代码块,并初始化程序员设置的变量值。
      2.分析 Class.forName()和ClassLoader.loadClass
  • Classloder.loaderClass(String name)
            其实该方法内部调用的是:Classloder. loadClass(name, false)
            方法:Classloder. loadClass(String name, boolean resolve)
          1:参数name代表类的全限定类名
          2:参数resolve代表是否解析,resolve为true是解析该类
          不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行。



  • Class.forName(String name)

其实该方法内部调用的是:
Class.forName0(String name, boolean initialize, ClassLoader loader)
1.参数name代表全限定类名
2.参数initialize表示是否初始化该类,为true是初始化该类
3.参数loader 对应的类加载器
         该方法默认需要初始化,一旦初始化,就会触发目标对象的 static块代码执行,static参数也也          会被再次初始化。
forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。
         A a = (A)Class.forName("pacage.A").newInstance();
        这才是和 A a = new A();一样的效果。
 
        3.数据库链接为什么使用Class.forName(className)
     JDBC Driver源码如下:使用Class.forName(className)才能在反射回去类的时候执行static块。


  • static {
             try {
                 java.sql.DriverManager.registerDriver(new Driver());
             } catch (SQLException E) {
                 throw new RuntimeException("Can't register driver!");
             }
         }

        3.总结
          在使用反射时,需要判断是否初始化目标,也就是说,是否需要执行其静态块和静态对象。
需要执行则使用Class.forName(className),不需要执行可以使用Classloder.loaderClass(String name)





最新喜欢:

何万里何万里 陈万琛陈万琛
陈万琛
侠客
侠客
  • UID499
  • 粉丝0
  • 关注0
  • 发帖数17
  • 社区居民
沙发#
发布于:2019-03-29 09:57
学习了
刘广昱
骑士
骑士
  • UID363
  • 粉丝1
  • 关注1
  • 发帖数31
  • 社区居民
板凳#
发布于:2019-03-29 09:57
沙发~
何万里
神圣使者
神圣使者
  • UID60
  • 粉丝20
  • 关注121
  • 发帖数37
  • 社区居民
  • 忠实会员
  • 追星一族
地板#
发布于:2019-03-29 09:57
谢谢分享!
不勤劳,连棵花也养不活。
刘广昱
骑士
骑士
  • UID363
  • 粉丝1
  • 关注1
  • 发帖数31
  • 社区居民
4楼#
发布于:2019-03-29 09:58
受益匪浅
游客

返回顶部