【注释和反射】获取class类实例的方法

news/2024/5/18 12:16:39

目录

一、获取一个类的Class对象的几种方法

代码

二、哪些类型可以有Class对象?

代码


一、获取一个类的Class对象的几种方法

Class对象是访问类元数据的入口,通过它可以获取类的名称、方法、字段、构造器、注解等信息,还可以创建类的实例、调用方法等。

在Java中,获取一个类的Class对象主要有以下几种方式:

(1)使用.class语法: 对于任何类型(包括基本类型)的变量,都可以使用.class来获取其Class对象。

(2)使用对象的getClass()方法: 如果你有一个对象,你可以调用它的getClass()方法来获取它的Class对象。

(3)使用Class.forName()方法: 如果你知道类的全名(包括包名),你可以使用Class.forName()方法来获取其Class对象。这种方式通常用于动态加载类。

(4)使用对象的getSuperclass()方法:一个已经存在的Class对象,代表某个类的类型。调用getSuperclass()方法会返回表示该类父类的Class对象。如果该类没有显式地继承其他类,那么它隐式地继承自java.lang.Object类,因此getSuperclass()方法将返回Object类的Class对象。

(5)使用基本类型的包装类中的TYPE字段: 对于基本类型,它们的包装类都有一个名为TYPE的静态字段,该字段是该基本类型的Class对象。

注意:int.classInteger.class是不同的,前者是基本类型的Class对象,后者是包装类的Class对象。

代码

在这个代码中,展示了获取一个类的Class对象的几种方法,并调用了c4.hashCode()方法,这会返回c4对象(即表示父类的Class对象)的哈希码。哈希码通常用于在哈希表等数据结构中快速定位对象。

每个对象的哈希码在对象的生命周期内应该保持一致,并且不同的对象根据equals()方法的比较结果,可能拥有相同的哈希码(这种情况称为哈希冲突)。 

public class Test {public static void main(String[] args) throws ClassNotFoundException {Person person = new Student();System.out.println(person.name);Class c1 = person.getClass();System.out.println(c1.hashCode());Class c2 = Student.class;System.out.println(c2.hashCode());Class c3 = Class.forName("com.itheima.sjms.Student");System.out.println(c3.hashCode());Class c4 = c1.getSuperclass();System.out.println(c4.hashCode());Class c5 = Person.class;System.out.println(c5.hashCode());Class c6 = Integer.TYPE;System.out.println(c6.hashCode());}
}class Person{String name;public Person(String name){this.name = name;}public Person() {}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}class Student extends Person{public Student() {this.name = "学生";}
}class Teacher extends Person{public Teacher() {this.name = "老师";}
}

总结:在Java中,获取Class对象的方式主要有.class语法、对象的getClass()方法、Class.forName()方法以及基本类型的包装类中的TYPE字段(但通常我们使用.class语法来获取基本类型的Class对象)。

  • 若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
  • 已知某个类的实例,调用该实例的getClass()方法获取Class对象
  • 已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
  • 内置基本数据类型可以直接用类名.Type
  • 还可以利用ClassLoader

二、哪些类型可以有Class对象?

Class对象是访问类元数据的入口,通过它可以获取类的名称、方法、字段、构造器、注解等信息,还可以创建类的实例、调用方法等。

在Java中,几乎所有类型都可以有对应的Class对象。这些类型包括:

代码

在这个代码中,展示了可以有Class对象的一些类型,

  1. 普通类(包括内部类和匿名类): 每个加载到JVM中的普通类都会有一个对应的Class对象。这包括顶层类、嵌套类(静态内部类)和非静态内部类。

  2. 接口: 接口也有对应的Class对象。虽然接口不能实例化,但它们的Class对象描述了接口的结构,包括方法签名等。

  3. 数组: 数组在Java中是对象,并且每种数组类型都有其对应的Class对象。例如,int[].classString[].class分别表示整型数组和字符串数组的Class对象。

  4. 基本类型: 虽然基本类型(如intcharboolean等)不是对象,但Java为每种基本类型提供了包装类(如IntegerCharacterBoolean等),并且每种基本类型都有其对应的Class对象,如int.class。不过要注意,这里的int.class实际上是一个特殊语法,因为基本类型本身不是类。这种语法是为了在反射时能够方便地获取基本类型的Class对象。

  5. 枚举: 枚举类型在Java中是特殊的类,每个枚举类型都有一个Class对象。

  6. 注解类型: 注解也是一种特殊的接口,它们也有自己的Class对象。

  7. oid类型void类型也有对应的Class对象,即void.class。虽然void类型表示无返回值,但在反射中有时需要表示方法的返回类型为void

  8. 泛型类型: 泛型类型本身在运行时由于类型擦除不会有特定的Class对象。但是,你可以获取表示泛型边界或泛型超类的Class对象。例如,List<String>.class这样的表达式是不合法的,但你可以获取List.class并通过反射来检查其泛型信息(尽管这些信息在运行时是受限的)。

import scala.Int;
import java.lang.annotation.ElementType;public class Test {public static void main(String[] args){test2();}public static void test2(){Class c1 = Object.class;  // 类Class c2 = int[].class;  // 一维数组Class c3 = String[][].class;  // 二维数组Class c4 = void.class;  // voidClass c5 = Override.class;  // 注解Class c6 = Integer.class;  // 基本数据类型Class c7 = Class.class;  // ClassClass c8 = ElementType.class;  // 枚举Class c9 = Comparable.class;  // 接口System.out.println(c1);System.out.println(c2);System.out.println(c3);System.out.println(c4);System.out.println(c5);System.out.println(c6);System.out.println(c7);System.out.println(c8);System.out.println(c9);}public static void test1() throws ClassNotFoundException {Person person = new Student();System.out.println(person.name);Class c1 = person.getClass();System.out.println(c1.hashCode());Class c2 = Student.class;System.out.println(c2.hashCode());Class c3 = Class.forName("com.itheima.sjms.Student");System.out.println(c3.hashCode());Class c4 = c1.getSuperclass();System.out.println(c4.hashCode());Class c5 = Person.class;System.out.println(c5.hashCode());Class c6 = Integer.TYPE;System.out.println(c6.hashCode());}
}class Person{String name;public Person(String name){this.name = name;}public Person() {}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}class Student extends Person{public Student() {this.name = "学生";}
}class Teacher extends Person{public Teacher() {this.name = "老师";}
}

同时,我们也可以看到,两个长度不一样的数组,只要它们类型一(,此处都是int类型),那么它们的哈希code,也就是它们底层的Class类依旧是一样的,和数组的长度无关。

int[] arr1 = new int[10];
int[] arr2 = new int[100];
System.out.println(arr1.getClass().hashCode());
System.out.println(arr2.getClass().hashCode());


http://www.mrgr.cn/p/00423822

相关文章

xgp怎么注册阿根廷账号 微软商店xgp阿根廷账号注册教程

xgp怎么注册阿根廷账号 微软商店xgp阿根廷账号注册教程 xgp游戏平台是微软公司针对pc用户开发的一款游戏平台&#xff0c;在平台内有着知名的月包服务&#xff0c;玩家们只需每个月支付固定的费用&#xff0c;即可免费玩到不同的游戏大作&#xff0c;xgp平台也正是由月包服务…

js生成不同的阅读数分配到每一篇上面,不会因为刷新而变动

js生成不同的阅读数分配到每一篇上面,不会因为刷新而变动 {%- for article in blog.articles -%}<div class"blog-articles__article article">{%- render article-card,article: article,media_height: section.settings.image_height,media_aspect_ratio: a…

基于K-prototype算法聚类

k-prototype聚类是一种用于混合数据类型聚类的算法&#xff0c;由Jain和Dubes在1988年提出。它主要用于同时包含连续属性和离散属性的数据集。k-prototype算法可以看作是k-means算法的扩展&#xff0c;它将k-means算法的思想应用于混合数据类型&#xff0c;通过为连续属性和离散…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

[Linux_IMX6ULL驱动开发]-设备树简述

目录 设备树的引入 设备树具体框架 设备树的属性 label address-cells和size-cells compatible model status reg 设备树的编译 内核对设备树的处理 plateform_device如何对应plateform_driver 设备树的引入 之前已经学习了解过了总线驱动模型的概念&#xff0c;也…

《智能前沿:应对ChatGPT算力挑战》

在全球人工智能热潮中&#xff0c;以 ChatGPT 为代表的 AIGC 技术引发了广泛关注。人工智能和机器学习等技术对数据规模及处理速度等提出了更高要求。在数据成为主要生产要素的当下和未来&#xff0c;如何跟上时代的发展步伐&#xff0c;构建适应 AI 需求的数据中心&#xff0c…

Oracle Hint 语法详解

什么是Hint Hint 是 Oracle 提供的一种 SQL 语法&#xff0c;它允许用户在 SQL 语句中插入相关的语法&#xff0c;从而影响 SQL 的执行方式。 因为 Hint 的特殊作用&#xff0c;所以对于开发人员不应该在代码中使用它&#xff0c;Hint 更像是 Oracle 提供给 DBA 用来分析诊断问…

linux 定位进程文件路径

有时候用top 打开任务管理器时知道某个任务的进程的存在&#xff0c;但不知道是哪个文件&#xff0c;只需两条指令只可定位进程的可执行文件路径 使用 ls -l /proc/<PID>/cwd 命令来查找该进程的当前工作目录。使用 cat /proc/<PID>/cmdline 命令来查看该进程的命…

3. 无重复字符的最长子串/438. 找到字符串中所有字母异位词/560. 和为 K 的子数组

3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 思路&#xff1a;想象一下我们…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

怎样用PHP语言实现远程控制三路开关

怎样用PHP语言实现远程控制三路开关呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制三路开关&#xff0c;三路开关可控制三路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi墙…

【提示学习论文】BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning论文原理

BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning BlackVIP:稳健迁移学习的黑盒视觉提示 问题 黑盒白盒&#xff1f; 黑盒和白盒的概念与对预训练模型内部参数的了解程度相关。黑盒指的是对预训练模型的参数和结构缺乏详细了解&#xff0c;通常只能通过使…

python爬虫小案例——汽车之家

本篇文章是使用bs4中的BeautifulSoup和requests解析网页和获取数据&#x1f451;&#x1f31f; 文章目录 &#x1f31f;前言一、&#x1f349;bs4中的BeautifulSoup二、&#x1f349;bs4的语法三、&#x1f349;内容实践1. 确定想要爬取的内容2. 分析网页3. 获取数据分析 &…

三、CPU基础-缓存

计算机中缓存一般分为两个部分 1.内存 2.CPU Cache 一、CPU Cache分级 CPU Cache 通常分为大小不等的三级缓存&#xff0c;分别是 L1 Cache、L2 Cache 和 L3 Cache。 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的&#xff08;通常会分为「数据缓存」和「指令缓存」&#…

QA测试开发工程师面试题满分问答20: 软件的安全性应从哪几个方面去测试?

软件的安全性测试应从多个方面进行&#xff0c;并确保覆盖以下关键方面&#xff1a; 当回答问题时&#xff0c;可以根据自己的经验和知识&#xff0c;从上述要点中选择适合的方面进行详细说明。强调测试的综合性、全面性和持续性&#xff0c;并强调测试的重要性以及如何与开发团…

政安晨:【Keras机器学习示例演绎】(七)—— 利用 NeRF 进行 3D 体积渲染

目录 简介 设置 下载并加载数据 NeRF 模型 训练 可视化训练步骤 推理 渲染三维场景 可视化视频 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0…

01-服务与服务间的通信

这里是极简版&#xff0c;仅用作记录 概述 前端和后端可以使用axios等进行http请求 服务和服务之间也是可以进行http请求的spring封装的RestTemplate可以进行请求 用法 使用bean注解进行依赖注入 在需要的地方&#xff0c;自动注入RestTemplate进行服务和服务之间的通信 注…

制造数字化“管理套路”

在当今竞争激烈的市场环境中&#xff0c;制造企业始终关心三个核心问题&#xff1a;生产效率、产品质量、成本控制&#xff0c;所以许多企业渴望加强对生产过程的管理控制。 生产过程是一个相对复杂的过程&#xff0c;涉及到多个环节和因素。从原材料的采购到产品的设计、生产…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…

idea中打印日志不会乱码,但是部署到外部tomcat中乱码了。

问题&#xff1a;如图Tomcat乱码&#xff0c;而且启动时的系统日志不会乱码&#xff0c;webapp中的打印日志才乱码。 idea中的情况如下&#xff1a;正常中文展示。 问题分析&#xff1a;网上分析的原因是Tomcat配置的字符集和web应用的字符集不匹配&#xff0c;网上集中的解决…