Java中的Class类以及获取Class对象的三种方式

来源:互联网 发布:侧卧按键开关封装淘宝 编辑:程序博客网 时间:2024/06/06 00:15

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.TYPEchar.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

  1. 获得一个 Class 对象
  2. Thinking in Java
0 0
原创粉丝点击