何为Class对象?
Class是Java中的一个类:java.lang.Class
Class类的每个对象对应于Java应用程序中运行的每个类或接口。
换言之,Java中的每个类或接口都有它的一个Class对象,存储着关于类的一些信息。
显然,Class对象是跟类 进行mapping的,同一个类的每一个对象拥有相同的Class对象。
此外,不仅是对于类,那些Java中的基本数据类型也有对应的Class对象。
如何获取某个类的Class对象?
(假使我们有一个类com.test.MyClass,来获取这个类的Class对象)
常见的获取方式有三种:
1.如果我们已经拥有了该类的一个实例(对象)obj1 ,我们直接可以通过它获取。
MyClassobj1= newMyClass();
Class<?>obj1Class= obj1.getClass();
这种方式的使用前提是:我们已经拥有了一个类的实例。
2.我们可以Class类的静态方法forName()获取。
forName()方法有几种重载,其中一种是直接传入要获取类的全名即可。
Class<?>mainClass= Class.forName("com.test.MyClass");
3.我们还可以使用类字面常量进行获取。
我们直接可以通过使用MyClass.class得到该类的一个Class对象。
第二和第三种方式不仅是形式上的不同,另外一个重要的不同点是:
使用静态方法forName()会对类进行初始化,而使用类字面常量.class则不会。
假使我们的类里有一个static函数,在类进行初始化时它会被调用。
class MyClass {
static {
System.out.println("MyClass static fun");
}
}
我们使用两种方式分别获取MyClass类的Class对象.
Class<?> myClass1 = MyClass.class;
System.out.println("seperate");
try {
Class<?> myClass2 = Class.forName("com.hyl.MyClass");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
output:
seperate
MyClassstatic fun
从输出内容可以看出,使用forName静态方法会对类进行初始化,而使用类字面常量则不会。
Class类的几个重要方法
静态方法Class.foName()
获取类的Class对象.
ClassLoadergetClassLoader()
得到该类的类加载器
StringetSimpleName()
得到该类的简称
StringgetName()
得到该类的全名
StringgetCanonicalName()
得到该类的规范化全称
Field[]getFields()
得到该类的所有可访问字段
Method[]getMethods()
得到该类的所有公共方法
TnewInstance()
得到该类的一个实例化对象