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)返回的是一个类
// 假如有这么一个类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区别
- Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制
## JDBC与 Class.forName的关系
> 我们在开发过程中,加载数据库驱动的时候,都会用到Class.forName
那么,为什么有的需要newInstance(),而有的不需要?
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()概述的主要内容,如果未能解决你的问题,请参考以下文章