探索 Java 中 `Class.java` 的属性与方法

简介: 探索 Java 中 `Class.java` 的属性与方法

Java 中的 java.lang.Class 类作为所有类和接口的元数据容器,提供了丰富的属性和方法以供开发者进行反射操作、类型检查等。本文将详细阐述 Class 类的主要属性和方法,并通过示例进行说明。

属性概览

以下是一些 Class 类的关键属性

  • name: 字符串类型,表示类或接口的全限定名(如 java.lang.String)。
  • classLoader: ClassLoader 类型,代表加载该类的类加载器。
  • allPermDomain: ProtectionDomain 类型,存储类的保护域信息,与安全策略相关。
  • useCaches: 布尔类型,指示是否使用缓存来优化某些反射操作。
  • reflectionData: ReflectionData 类型,内部类,存储有关类的反射数据,如方法、字段、注解等。
  • classRedefinedCount: 整形,记录类被重新定义的次数,用于检测类定义变化。
  • genericInfo: 与泛型相关的内部类实例,存储泛型信息。
  • serialVersionUID: 长整型,类的序列化版本标识符。
  • serialPersistentFields: ObjectStreamField 数组,表示需要序列化的持久化字段。
  • reflectionFactory: ReflectionFactory 类型,提供创建反射对象(如 ConstructorMethod 等)的方法。
  • 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(): 获取类或接口的修饰符(如 publicabstract 等)。
  • 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 反射机制,实现灵活而强大的程序设计。

目录
相关文章
|
2天前
|
安全 Java UED
深度解析Java中方法内的异步调用实践与应对方案
深度解析Java中方法内的异步调用实践与应对方案
8 1
|
2天前
|
Java
深入了解Java中的BigDecimal类及其方法
深入了解Java中的BigDecimal类及其方法
9 1
|
2天前
|
Java 编译器
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
5 1
|
2天前
|
监控 Java
优化Java应用的日志记录方法
优化Java应用的日志记录方法
|
2天前
|
设计模式 安全 Java
在Java中实现单例模式的正确方法
在Java中实现单例模式的正确方法
|
2天前
|
Java 编译器 索引
解决Java中的NoSuchElementException异常的常见方法
解决Java中的NoSuchElementException异常的常见方法
|
2天前
|
存储 缓存 安全
Java List操作详解及常用方法
Java List操作详解及常用方法
|
2天前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
10 0
|
2天前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
7 0
|
2天前
|
存储 缓存 NoSQL
Java中Redis常用的20个方法
Java中Redis常用的20个方法
7 0