Java中的Class类以及获取Class对象的三种方式
java.lang.Class
之前Hadoop里面job.setMapperClass(Map.class)
之类的方法用到了 xxx.class
的写法,当时也没有深究。这两天又遇到了xxx.getClass()
的写法,稍微看了一下。
java API里这样写道:
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
每个类在编译后都会产生一个Class对象,被保存在同名.class文件中。运行时,类加载器检查所需的类的Class对象是否已经加载,如果没有,就从.class文件中加载该类的Class对象,然后用该Class对象创建该类的所有对象。
获得一个Class对象
className.class
形如className.class,我们称之为类字面常量
。
Class c = java.awt.Button.class;
Class c = Integer.TYPE;
注意:
TYPE用于基本数据类型的包装器类。TYPE字段是一个引用,指向对应的基本数据类型的Class对象。所以:
boolean.class 等价于 Boolean.TYPE
char.class 等价于 Char.TYPE
......
instanceName.getClass()
java.lang.Object
类的getClass()
方法返回此时Object的Runtime类。
故而在可以获得实例的情况下,可以使用该方法:
Class c = instanceName.getClass();
如:
TextField t = new TextField();
Class c = t.getClass();
Class s = c.getSuperclass();
Class.forName(String className)
Class.forName(str)
返回与带有给定字符串名的类或接口相关联的 Class 对象。 要求str为所需类的完全限定名。
如:
Class c1 = Class.forName (“java.lang.String”);
String str = “java.awt.Button”;
Class c2 = Class.forName (str);
Class c3 = Class.forName (“java.util.LinkedList$Entry”);
同时forName()方法要求必须catch异常 ClassNotFoundException。
如下例子程序:
import java.awt.Button;
public class Test {
public static void main(String[] args) {
String str = "java.awt.Button";
try {
Class c2 = Class.forName(str);
System.out.println(c2.getName());
}
catch(Exception e) {
}
}
}
Reference
- 获得一个 Class 对象
- Thinking in Java