Java反射机制class类

java的Class类是java反射机制的基础,经过Class类咱们能够得到关于一个类的相关信息,下面咱们来了解一下有关java中Class类的相关知识!java

java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息。对象

当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,能够经过这个Class对象对被装入类的详细信息进行访问。接口

简单的说,获取某一个类所对应的Class对象能够经过以下三种途径:字符串

1. Object的getClass方法
java.lang.Object中定义有getClass方法:get

public final Class getClass()it

全部Java对象都具有这个方法。该方法用于返回与调用该方法对象所属类关联的Class对象,例如:io

Date date1 = new Date();class

Date date2 = new Date();基础

Class c1 = date1.getClass();date

Class c2 = date2.getClass();

System.out.println(c1.getName()); // java.util.Date

System.out.println(c1 == c2); // true

上面的代码中,调用Date对象date1的getClass方法将返回用于封装Date类信息的Class对象。这里调用了Class类的getName方法:

public String getName()

这个方法的含义很直观,即返回所封装的类的名称。

须要注意的是,代码中的date1和date2的getClass方法返回了相同的Class对象(c1==c2的值为true)。这是由于,对于相同的类,JVM只会载入一次,而与该类对应的Class对象也只会存在一个,不管该类实例化了多少对象。

另外,须要强调的是,当一个对象被其父类的引用或其实现的接口类型的引用所指向的时,getClass方法返回的是与对象实际所属类关联的Class对象。例如:

List list = new ArrayList();

System.out.println(list.getClass().getName()); // java.util.ArrayList

上面的代码中,语句list.getClass()方法返回的是list所指向对象实际所属类java.util.ArrayList对应的 Class对象而并未java.util.List所对应的Class对象。有些时候能够经过这个方法了解一个对象的运行时类型,例如:

HashSet set = new HashSet();

Iterator it = set.iterator();

System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator

从代码能够看出,HashSet的iterator方法返回的是实现了Iterator接口的HashMap内部类(KeyIterator)对象。

由于抽象类和接口不可能实例化对象,所以不能经过Object的getClass方法得到与抽象类和接口关联的Class对象。

2. 使用.class的方式
使用类名加“.class”的方式即会返回与该类对应的Class对象。例如:

Class clazz = String.class;

System.out.println(clazz.getName()); // java.lang.String

这个方法能够直接得到与指定类关联的Class对象,而并不须要有该类的对象存在。

3. 使用Class.forName方法
Class有一个著名的static方法forName:

public static Class forName(String className) throws ClassNotFoundException

该方法能够根据字符串参数所指定的类名获取与该类关联的Class对象。若是该类尚未被装入,该方法会将该类装入JVM。

该方法声明抛出ClassNotFoundException异常。顾名思义,当该方法没法获取须要装入的类时(例如,在当前类路径中不存在这个类),就会抛出这个异常。

例如,若是当前类路径中存在Foo类:

package org.whatisjava.reflect;

public class Foo {

public Foo() {

System.out.println("Foo()");

}

static {

System.out.println("Foo is initialized");

}

}

运行下面的代码:

Class clazz = Class.forName("org.whatisjava.reflect.Foo");

控制台会有以下输出:

Foo is initialized

Class.forName("org.whatisjava.reflect.Foo")首先会将reflection.Foo类装入JVM,并 返回与之关联的Class对象。JVM装入Foo类后对其进行初始化,调用了其static块中的代码。须要注意的是:forName方法的参数是类的完 整限定名(即包含包名)。

区别于前面两种获取Class对象的方法。使用Class.forName方法所要获取的与之对应的Class对象的类能够经过字符串的方式给定。该方法一般用于在程序运行时根据类名动态的载入该类并得到与之对应的Class对象。
 

经过上面的文章相信你对java的反射机制有了必定的认识,同时也对java中Class类的用法有了比较清晰的理解,在咱们实际工做的过程当中,咱们不断的运用java知识来解决实际生湖中的问题的时候咱们就能对java反射机制有一个更深刻的理解!

相关文章
相关标签/搜索