Java 中的 java.lang.Class
类作为所有类和接口的元数据容器,提供了丰富的属性和方法以供开发者进行反射操作、类型检查等。本文将详细阐述 Class
类的主要属性和方法,并通过示例进行说明。
属性概览
以下是一些 Class
类的关键属性:
name
: 字符串类型,表示类或接口的全限定名(如java.lang.String
)。classLoader
:ClassLoader
类型,代表加载该类的类加载器。allPermDomain
:ProtectionDomain
类型,存储类的保护域信息,与安全策略相关。useCaches
: 布尔类型,指示是否使用缓存来优化某些反射操作。reflectionData
:ReflectionData
类型,内部类,存储有关类的反射数据,如方法、字段、注解等。classRedefinedCount
: 整形,记录类被重新定义的次数,用于检测类定义变化。genericInfo
: 与泛型相关的内部类实例,存储泛型信息。serialVersionUID
: 长整型,类的序列化版本标识符。serialPersistentFields
:ObjectStreamField
数组,表示需要序列化的持久化字段。reflectionFactory
:ReflectionFactory
类型,提供创建反射对象(如Constructor
、Method
等)的方法。initted
: 布尔类型,指示类是否已初始化。enumConstants
: 枚举常量数组,仅对枚举类有效。enumConstantDirectory
: 内部类实例,用于快速查找枚举常量。annotationData
: 存储类及其成员注解的内部类实例。
annotationType
: 对于注解类,存储其对应的Class
对象。classValueMap
: 存储ClassValue
对象,用于高效地根据类计算相关值。
方法详解
以下列举并解释 Class
类的部分重要方法:
类加载与实例化
forName(String className)
: 根据类名加载类并返回对应的Class
对象,抛出异常处理类加载失败。forName0(String name, boolean initialize, ClassLoader loader, Class<?> caller)
: 内部方法,实际执行forName()
。
newInstance()
: 创建并初始化该类的一个新实例,通常用于非抽象类且具有默认构造器的情况。
类型判断与转换
isInstance(Object obj)
: 判断给定对象是否为该类的实例。isAssignableFrom(Class<?> cls)
: 判断指定类是否可赋值给当前类(即是否为其子类或实现类)。isInterface()
: 判断是否为接口。isArray()
: 判断是否为数组类。
isPrimitive()
: 判断是否为基本类型或 void。isAnnotation()
: 判断是否为注解类型。isSynthetic()
: 判断是否为编译器生成的合成类或方法。
获取类信息
getName()
: 获取类或接口的全限定名。getSimpleName()
: 获取类或接口的简单名称(不包含包名)。getTypeName()
: 获取符合 Java 语言规范的类型名称。getCanonicalName()
: 获取类或接口的规范名称,对于匿名类或本地类可能返回null
。getPackage()
: 获取包含该类的包对象。getSuperclass()
: 获取父类的Class
对象。getGenericSuperclass()
: 获取带有泛型信息的父类类型。getInterfaces()
: 获取当前类实现的所有接口的Class
对象数组。getGenericInterfaces()
: 获取带有泛型信息的接口类型数组。getComponentType()
: 对于数组类,获取其元素类型。getModifiers()
: 获取类或接口的修饰符(如public
、abstract
等)。getSigners()
: 获取类的签名者信息,通常为空。
setSigners(Object[] signers)
: 设置类的签名者信息。
反射操作
getEnclosingMethod()
: 获取嵌套类或局部类所封闭的方法。getEnclosingConstructor()
: 获取嵌套类所封闭的构造函数。getDeclaringClass()
: 获取声明当前类或接口的类。getEnclosingClass()
: 获取嵌套类或局部类所封闭的类。getClasses()
: 获取当前类及其父类中所有公共类(包括嵌套类)的Class
对象数组。getFields()
: 获取当前类及其父类中所有公共字段的Field
对象数组。getMethods()
: 获取当前类及其父类中所有公共方法的Method
对象数组。getConstructors()
: 获取当前类的所有公共构造函数的Constructor
对象数组。getField(String name)
: 根据字段名获取特定公共字段的Field
对象。getMethod(String name, Class<?>... parameterTypes)
: 根据方法名和参数类型获取特定公共方法的Method
对象。
getConstructor(Class<?>... parameterTypes)
: 根据参数类型获取特定公共构造函数的Constructor
对象。
声明成员访问
getDeclaredClasses()
: 获取当前类中所有声明的类(包括私有嵌套类)的Class
对象数组。getDeclaredFields()
: 获取当前类中所有声明的字段(包括私有字段)的Field
对象数组。getDeclaredMethods()
: 获取当前类中所有声明的方法(包括私有方法)的Method
对象数组。getDeclaredConstructors()
: 获取当前类中所有声明的构造函数(包括私有构造函数)的Constructor
对象数组。getDeclaredField(String name)
: 根据字段名获取特定声明字段的Field
对象。getDeclaredMethod(String name, Class<?>... parameterTypes)
: 根据方法名和参数类型获取特定声明方法的Method
对象。
getDeclaredConstructor(Class<?>... parameterTypes)
: 根据参数类型获取特定声明构造函数的Constructor
对象。
其他方法
getResourceAsStream(String name)
: 根据相对路径获取类资源的输入流。getResource(String name)
: 获取类资源的 URL。getProtectionDomain()
: 获取类的保护域。getAnnotation(Class<T> annotationClass)
: 获取类上指定注解类型的实例。isAnnotationPresent(Class<? extends Annotation> annotationClass)
: 判断类上是否存在指定注解类型。
getAnnotations()
: 获取类上所有注解的数组。getDeclaredAnnotations()
: 获取类上所有声明注解的数组。
示例
import java.lang.reflect.Method; public class ClassDemo { public static void main(String[] args) throws Exception { // 类加载与实例化 Class<String> stringClass = Class.forName("java.lang.String"); String instance = stringClass.newInstance(); // 类型判断与转换 System.out.println(stringClass.isInstance(instance)); // 输出: true System.out.println(String.class.isAssignableFrom(stringClass)); // 输出: true // 获取类信息 System.out.println(stringClass.getName()); // 输出: java.lang.String System.out.println(stringClass.getSimpleName()); // 输出: String System.out.println(stringClass.getSuperclass()); // 输出: class java.lang.Object // 反射操作 Method lengthMethod = stringClass.getMethod("length"); System.out.println(lengthMethod.invoke(instance)); // 输出: 0 // 注解操作 if (stringClass.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation myAnnotation = stringClass.getAnnotation(MyAnnotation.class); System.out.println(myAnnotation.value()); } } } @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { String value(); }
以上便是对 Java Class
类主要属性和方法的详细介绍,涵盖了类加载、类型判断、反射操作、注解处理等多个方面。通过熟练掌握这些内容,开发者能够更深入地理解和利用 Java 反射机制,实现灵活而强大的程序设计。