探索 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 反射机制,实现灵活而强大的程序设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第12天:滑动窗口和前缀和

代码随想录算法训练营第12天&#xff1a;滑动窗口和前缀和 这里我参考了西法的博客&#xff0c; 467. 环绕字符串中唯一的子字符串(中等)795. 区间子数组个数(中等)904. 水果成篮(中等)992. K 个不同整数的子数组&#xff08;困难&#xff09;1109. 航班预订统计(中等) 前四…

第G9周:ACGAN理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 由于ACGAN的原理在上一篇文章中已经很详细的解释过了&#xff0c;这次我们直接上代码 一、代码解读 import argparse import os import numpy as npimport t…

视频批量下载工具

1、功能演示 该工具实现了某个人主页视频批量下载&#xff0c;最多支持一次下载50个视频&#xff0c;这50个选取的是最新发布的50个视频&#xff0c;视频为高清的1080p&#xff0c;并直接将视频保存到本地。 2、软件使用介绍 2.1 解压 拿到工具软件后&#xff0c;首先是对软件…

什么是外汇爆仓?怎样避免?

外汇爆仓是指当交易者的保证金低于特定比例时&#xff0c;经纪商会自动平仓一个或所有的开仓头寸。避免外汇爆仓的关键在于合理配置资金、设置止损、适度交易、顺势而为以及调整心态。 外汇爆仓是外汇交易中的一种风险控制机制。当交易者的账户净值低于已用保证金的特定比例时&…

AI图书推荐:《企业AI转型:如何在企业中部署ChatGPT?》

Jay R. Enterprise AI in the Cloud. A Practical Guide...ChatGPT Solutions &#xff08;《企业AI转型&#xff1a;如何在企业中部署ChatGPT&#xff1f;》&#xff09;是一本由Rabi Jay撰写、于2024年由John Wiley & Sons出版的书籍&#xff0c;主要为企业提供实施AI转型…

【网络安全】00后程序员,找 Bug 赚了 6,700,000元!他是怎么做到的?

1. 漏洞赏金计划&#xff08;Bug Bounty Programs&#xff09; 2. 安全咨询服务 3. 安全培训和教育 4. 写作和发表研究 5. 参与安全竞赛&#xff08;CTFs&#xff09; 6. 开发和销售安全工具 在网络安全领域&#xff0c;通过合法的方式利用漏洞赚钱主要涉及以下几种方法。…

【服务器部署篇】Linux下Tomcat安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

记录一次 vue3 + ele pls 改写 饿了么主题色实践

一、改写 element 主题色 在 main.ts 中引入需要改写的 scss 文件 main.ts: import ./styles/element-plus.scss在自定义的 element-plus.scss 文件中改写 ele pls 的变量 element-plus.scss&#xff1a; /** * 更改主题色 */ :root {--el-color-primary: #285fbb; // 主…

python使用opencv对图像的基本操作(3)

17.颜色空间的转换 17.1.rgb图像转gray图像 from skimage import io,color img io.imread(lbxx.jpg) img_gray color.rgb2gray(img) #将rgb图像转换成gray图像 io.imshow(img_gray)运行结果&#xff1a; 17.2.rgb图像转hsv图像 from skimage import io,color img io.im…

网红大佬的面子,高阶智驾的里子 | 2024北京车展

相关阅读&#xff1a;2023北京车展 《没有争奇斗艳的车模&#xff0c;只有往死里卷的智能汽车》。 文&#xff5c;刘俊宏 李想、李斌绑定“车圈新顶流”雷军互相抬轿子&#xff0c;红衣大叔周鸿祎高情商点评各家汽车新品...... 为了流量&#xff0c;今年车企大佬们比任何时候…

volatile的相关知识点

volatitle这个关键字&#xff0c;不管是在Java还是在C中都有使用到&#xff0c;但是在两种语言中&#xff0c;由于编译器的原因&#xff0c;他们存在一点点区别。 C中的volatile关键字 在C中volatile主要用于告诉编译器&#xff0c;这个变量的值可能会意外改变 ,例如被硬件或者…

力扣刷题 62.不同路径

题干 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …

HertzBeat:一款开源实时监控告警系统,简直太好用了!

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

训练营第三十六天动态规划(基础题part2)

训练营第三十六天动态规划&#xff08;基础题part2&#xff09; 62.不同路径 力扣题目链接 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&am…

企业计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程

对于众多的企业来说&#xff0c;通过网络开展各项工作业务已经成为常态&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;也大大加快了企业发展的步伐&#xff0c;但众多企业越来越重视企业发展中的核心数据安全问题。近期&#xff0c;云天数据恢复中心接到众多企业…

Linux的学习之路:21、线程(1)

摘要&#xff1a; 本章说一下线程 目录 摘要&#xff1a; 一、回忆一下 二、如何理解线程 三、命令行看线程 四、利用函数进行使用 五、本章总结 1、线程的优点 2、线程的缺点 3、线程的异常 4、线程的用途 一、回忆一下 1、exe就是一个文件 2、我们的可执行程序…

企业工厂如何逆风翻盘:VR全景打破多重桎梏

现阶段&#xff0c;制造业工厂面临的困境&#xff0c;就是用着上百万的设备&#xff0c;却赚着几毛钱的利润。传统的工厂参观方式也存在着很多的局限性&#xff0c;例如时间上不方便、不能实地参访、生产线具有隐患等&#xff0c;都会使得参观者不能深入地了解工厂的生产环境和…

大模型对数字营销的驱动赋能

一、大模型驱动的营销数智化个信未来发展趋势 1.模型算法能力全面升级 大模型凭借智能化的用户洞察&#xff0c;个性化的需求预测、系统化的数据分析、效率化的营销决策以及实实化的全域检测支持&#xff0c;为营销行业更加准确地把握市场动态和消费者需求提供了强大支持。可以…

ubuntu22.04 修改内核源码教程

1. 确认当前内核版本 uname -a 2. 去ubuntu官网下载对应版本内核源码 6.5.0-28.29 : linux package : Ubuntu (launchpad.net) 3. 准备编译环境 sudo apt-get install libncurses5-dev libssl-dev build-essential openssl flex bison libelf-dev tar -xzvf linux_6.5.…

【VS+QT】visual studio 2022配置和搭建QT

一、下载QT 可以去QT官网下载:https://www.qt.io/product/development-tools。 直接安装。 二、安装qt插件 打开visual studio 2022&#xff0c;选择菜单栏中扩展->管理扩展 ,然后直接在vs插件市场搜索Qt Visual Studio Tools就行。 安装的时候根据提示&#xff0c;关闭…
最新文章