在Java中,每个类都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于存储这个类的类型信息。
获取Class实例的三种方式:
(1)利用对象调用getClass()方法获取该对象的Class实例;(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例(static Class forName(String className) Returns the Class object associated with the class or interface with the given stringname);
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例;
在程序运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
import java.lang.reflect.Method;
public class Test {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
//1
// Class sClass = Test.class;
//2
// Test test = new Test();
// Class sClass = test.getClass();
//3
Class sClass = Class.forName("Test");
//Fundamental class could use xxx.TYPE to get a Class object
// Class sClass = Integer.TYPE;
Method[] listMethods = sClass.getDeclaredMethods();
for (int i = 0; i < listMethods.length; i++) {
System.out.println(listMethods[i]);
}
}
public void a(){
System.out.println("This is a!");
}
}
输出:
public static void Test.main(java.lang.String[]) throws java.lang.ClassNotFoundException
public void Test.a()
关于Java的反射机制,有一篇官方的文章非常好:
http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html