Class.forName()概述

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Class.forName()概述相关的知识,希望对你有一定的参考价值。

## Class.forName解析


 从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:


- 这个类已经加载


- 这个类已经连接了


而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。


> 现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。



- Class.forName(xxx.xx.xx)返回的是一个类


- Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段


// 假如有这么一个类A:

public class A {
  public void foo(String name) {
    System.out.println("Hello, " + name);
  }
}

// 可以编写另外一个类来反射调用A上的方法: 
import java.lang.reflect.Method;
public class TestClassLoad {
  public static void main(String[] args) throws Exception {
    Class<?> clz = Class.forName("A");
    Object o = clz.newInstance();
    
    // 获取类型方法
    Method m = clz.getMethod("foo", String.class);
    for (int i = 0; i < 16; i++) {
      m.invoke(o, Integer.toString(i));
    }
  }
}

## new 与 Class.forName区别


- newInstance( )是一个方法,而new是一个关键字


- Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制


## JDBC与 Class.forName的关系


> 我们在开发过程中,加载数据库驱动的时候,都会用到Class.forName


那么,为什么有的需要newInstance(),而有的不需要?


JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的 Driver类的代码都必须类似如下:
public class MyJDBCDriver implements Driver {
    static {
        DriverManager.registerDriver(new MyJDBCDriver());
    }
}
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX)就可以了。

本文出自 “MU” 博客,请务必保留此出处http://manunited1985.blog.51cto.com/13432434/1983340

以上是关于Class.forName()概述的主要内容,如果未能解决你的问题,请参考以下文章

Class.forName()概述

java反射中,Class.forName和classloader的区别(代码说话)

为啥 Class.forName() 对我不起作用?

Class.forName()

Java中Class.forName()用法详解

Class.forName()用法详解