一个Class对象代表了Java应用程序在运行时所载入的类或接口,也用来表达enum(属于类的一种)、 annotation(属于接口的一种)、数组、原生类型(primitive type)、void。
Class没有公开(public)的构造函数,Class对象是由JVM自动产生,每当一个类被载入时,JVM就自动为其生成一个Class对象。
您可以透过Object的getClass()来取得每一个对象对应的Class对象,或者是透过class常量(Class literal),下面这个程序简单的使用getClass()方法来取得String类的一些基本信息:
package onlyfun.caterpillar; public class ClassDemo { public static void main(String[] args) { String name = "caterpillar"; Class stringClass = name.getClass(); System.out.println("getName: " + stringClass.getName()); System.out.println("isInterface: " + stringClass.isInterface()); System.out.println("isPrimitive: " + stringClass.isPrimitive()); System.out.println("isArray: " + stringClass.isArray()); System.out.println("SuperClass: " + stringClass.getSuperclass().getName()); } }
执行结果:
getName: java.lang.String
isInterface: false
isPrimitive: false
isArray: false
SuperClass: java.lang.Object
|
您也可以直接使用以下的方式来取得String类的Class对象:
Class stringClass = String.class;
在Java中,数组也属于一个类,也有对应的Class对象,这个
对象是由所有具相同元素与维度的数组所共用,而原生类型像是boolean, byte, char, short, int, long,
float, double以及关键字void,也都有对应的Class对象,您也都可以用类常量(Class
literal)来取得这些对象,例如:
public class ClassDemo { public static void main(String[] args) { System.out.println(boolean.class.getName()); System.out.println(boolean.class.isPrimitive()); System.out.println(void.class.getName()); } }
执行结果:
在一些应用中,您无法事先知道使用者将载入什么类,您可以使用Class的forName()方法实现动态加载类,下面这个例子让您可以指定类名称
来获得类的相关信息:
package onlyfun.caterpillar; public class ClassDemo { public static void main(String[] args) { try { Class c = Class.forName(args[0]); System.out.println("getName: " + c.getName()); System.out.println("isInterface: " + c.isInterface()); System.out.println("isPrimitive: " + c.isPrimitive()); System.out.println("isArray: " + c.isArray()); System.out.println("SuperClass: " + c.getSuperclass().getName()); } catch(ClassNotFoundException e) { e.printStackTrace(); } } }
执行结果:
java ClassDemo java.util.ArrayList
getName: java.util.ArrayList
isInterface: false
isPrimitive: false
isArray: false
SuperClass: java.util.AbstractList
|
Class对象的讯息是在编译时期就被加入至.class文件中,它是Java支持运行时型别辨识(RTTI,Run-
Time Type Information或Run-Time Type
Identification)的一种方式,在编译时期编译器会先检查对应的.class文件,而运行时JVM在没有用到该类时,就不会载入它,如果
要用到时,JVM会先检查对应的Class对象是否已经载入,如果没有载入,则会寻找对应的.class文件并载入它。
您可以使用Class.forName()方法动态加载类,之后使用Class的newInstance()方法产生实例,下面这个程序是个简单的示
范,您可以动态载入实现List的类
:
package onlyfun.caterpillar;
import java.util.*;
public class ClassDemo { public static void main(String[] args) { try { Class c = Class.forName(args[0]); List list = (List) c.newInstance(); for(int i = 0; i < 10; i++) { list.add("element " + i); } for(Object o: list.toArray()) { System.out.println(o); } } catch(ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
执行结果:
java ClassDemo java.util.ArrayList
element 0
element 1
element 2
element 3
element 4
element 5
element 6
element 7
element 8
element 9
|
|