源程序
package edu.test.ch7;
import java.lang.annotation.Annotation;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
public class ClassDeclarationViewer {
public static void main(String[] args) throws ClassNotFoundException{
Class> clazz=Class.forName("java.util.ArrayList");
System.out.println("类名: " + clazz.getName());
System.out.println("类的修饰符" + Modifier.toString(clazz.getModifiers()));
//输出泛型参数
TypeVariable> [] typeVariables=clazz.getTypeParameters();
System.out.println("类的泛型参数");
if(typeVariables.length!=0){
for(TypeVariable> typeVariable:typeVariables){
System.out.println(typeVariable+"\n");
}
}else{
System.out.println("空");
}
Type[] interfaces=clazz.getGenericInterfaces();
System.out.println("类所实现的接口");
if(interfaces.length!=0){
for (int i=0; i < interfaces.length; i++) {
System.out.println("\t" + interfaces[i]);
}
}else{
System.out.println("空");
}
Type superClass=clazz.getGenericSuperclass();
System.out.println("类的直接继承类: ");
if(superClass!=null){
System.out.println(superClass);
}else{
System.out.println("空");
}
Annotation[] annotations=clazz.getAnnotations();
System.out.println("类的注解: ");
if(annotations.length!=0){
for (Annotation an:annotations) {
System.out.println("\t" + an);
}
}else{
System.out.println("空");
}
}
}
运行效果:

技术分析: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
其他介绍
Class类的常用方法
1、getName()
一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
2、newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader()
返回该类的类加载器。
4、getComponentType()
返回表示数组组件类型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray()
判定此 Class 对象是否表示一个数组类。
Class的一些使用技巧
1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如
Object obj=Class.forName(s).newInstance();
2、虚拟机为每种类型管理一个独一无二的Class对象。因此可以使用==操作符来比较类对象。例如:
if(e.getClass()==Employee.class)...
四、来自SUN公司的java.long.Class类的API文档,网上有chm中文版的,很好找。为了查阅方便,我从SUN公司的JavaDoc站点上复制出来了Class类的API文档。
java.lang
类 Class
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
