在说明Class类的静态方法forName()之前,先清楚有关Class类的几个概念:
1、 Class类封装了类或接口的运行时状态
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,这些标示纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选择正确方法去执行,用来保存这些类型信息的类是Class类。
2、Class类型的对象是加载类时自动创建的
Class 没有公共构造方法。Class 对象是在加载类时由Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
3、虚拟机为每种类型管理一个独一无二的Class对象
每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
那么,我们如何获得Class 的对象呢?
通常是通过Object类(所有类的超类)定义的getClass()方法来获取Class对象;
再者就是匹配一个Java类型的类对象,比如:如果T是一个Java类型,那么T.class就代表了匹配的类对象;
第三种方法就是使用Class类的静态方法,语法格式是:
static Class<?> forName(String name) throws ClassNotFoundException //返回给定全名的Class对象
或者:“
static Class<?> forName(String name, boolean how, ClassLoader ldr)
//返回给定全名的Class对象。对象使用由ldr指定的加载器加载。如果how为true,就初始化对象;否则不进行初始化
Class.forName(className)实际上是调用Class.forName(className,true, this.getClass().getClassLoader())。第二个参数,是指Class被loading后是不是必须被初始化。可以看出,使用Class.forName(className)加载类时则已初始化。所以 Class.forName(className) 可以简单的理解为: 获得字符串参数中指定的类,并初始化该类 。
Class类的静态方法forName()的应用
1、加载JDBC驱动
class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
2、使用AIDL与电话管理Servic进行通信
Method method =Class. forName ( "android.os.ServiceManager" ).getMethod( "getService" ,String. class );