当前位置: 首页 > news >正文

【反射】Class类

Class类中包含了类定义的详细信息,可以使用Class类中提供的方法来获取,下面我们先获取Class对象,再介绍Class类中提供的获取类信息的方法。

一、准备工作

在src/test/java目录的cn.horse.reflect.entity包下新建BaseEntity类、UserInfoEntity类

BaseEntity类:

package cn.horse.reflect.entity;public abstract class BaseEntity {public Long id;public BaseEntity() { }public BaseEntity(Long id) {this.id = id;}public void setId(Long id) {this.id = id;}public Long getId() {return id;}
}

UserInfoEntity类:

package cn.horse.reflect.entity;@SuppressWarnings({})
public class UserInfoEntity extends BaseEntity {public String name;private Integer age;private UserInfoEntity() {}public UserInfoEntity(Long id) {super(id);}public UserInfoEntity(Long id, String name, Integer age) {super(id);this.name = name;this.age = age;}public void setAge(Integer age) {this.age = age;}public Integer getAge() {return age;}private String getName() {return name;}private void check() { }
}

二、获取Class对象的三种方式

在src/test/java目录的cn.horse.reflect包下新建GetClassInstanceTests测试类

GetClassInstanceTests类:

package cn.horse.reflect;import cn.horse.reflect.entity.UserInfoEntity;
import org.junit.jupiter.api.Test;import static org.assertj.core.api.Assertions.assertThat;public class GetClassInstanceTests {@Testpublic void testGetClassInstanceByBusObjectInstance() {assertThat(new UserInfoEntity(1L).getClass()).isNotNull();}@Testpublic void testGetClassInstanceByBusClass() {assertThat(UserInfoEntity.class).isNotNull();}@Testpublic void testGetClassInstanceByName() throws ClassNotFoundException {assertThat(Class.forName("cn.horse.reflect.entity.UserInfoEntity", false, this.getClass().getClassLoader())).isNotNull();}@Testpublic void testClassInstanceEquals() throws ClassNotFoundException {Class<?> forNameType = Class.forName("cn.horse.reflect.entity.UserInfoEntity", false, this.getClass().getClassLoader());Class<?> dotClassType = UserInfoEntity.class;Class<?> objectGetClassType = new UserInfoEntity(1L).getClass();assertThat(forNameType).isEqualTo(dotClassType);assertThat(dotClassType).isEqualTo(objectGetClassType);assertThat(forNameType).isEqualTo(objectGetClassType);}
}

单元测试方法介绍:

testGetClassInstanceByBusObjectInstance使用对象的实例获取Class对象

testGetClassInstanceByBusClass使用类获取Class对象

testGetClassInstanceByName使用全限类名获取Class对象

testClassInstanceEquals判断三种方法获取到的Class对象是否相等

单元测试中使用了三种方式获取Class对象,三种方式获取到的Class对象是相等的。

三、Class类中方法的使用

在src/test/java目录的cn.horse.reflect包下新建ClassInstanceMethodTests测试类

ClassInstanceMethodTests类:

package cn.horse.reflect;import cn.horse.reflect.entity.BaseEntity;
import cn.horse.reflect.entity.UserInfoEntity;
import org.junit.jupiter.api.Test;import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;public class ClassInstanceMethodTests {@Testpublic void testGetName() {assertThat(UserInfoEntity.class.getSimpleName()).isEqualTo("UserInfoEntity");assertThat(UserInfoEntity.class.getName()).isEqualTo("cn.horse.reflect.entity.UserInfoEntity");assertThat(UserInfoEntity.class.getPackage().getName()).isEqualTo("cn.horse.reflect.entity");}@Testpublic void testPrimitive() {assertThat(byte.class.isPrimitive()).isTrue();assertThat(short.class.isPrimitive()).isTrue();assertThat(int.class.isPrimitive()).isTrue();assertThat(long.class.isPrimitive()).isTrue();assertThat(float.class.isPrimitive()).isTrue();assertThat(double.class.isPrimitive()).isTrue();assertThat(boolean.class.isPrimitive()).isTrue();assertThat(void.class.isPrimitive()).isTrue();assertThat(int[].class.isPrimitive()).isFalse();assertThat(String.class.isPrimitive()).isFalse();assertThat(UserInfoEntity.class.isPrimitive()).isFalse();}@Testpublic void testArray() {assertThat(String[].class.isArray()).isTrue();assertThat(String[].class.getComponentType()).isEqualTo(String.class);}@Testpublic void testEnum() {assertThat(Locale.Category.class.isEnum()).isTrue();Collection<Locale.Category> enumConstantList = Arrays.asList(Locale.Category.class.getEnumConstants());List<Locale.Category> expectedEnumConstantList = Arrays.asList(Locale.Category.values());assertThat(enumConstantList.size()).isEqualTo(expectedEnumConstantList.size());assertThat(enumConstantList).containsAll(expectedEnumConstantList);}@Testpublic void testAnnotation() {assertThat(SuppressWarnings.class.isAnnotation()).isTrue();}@Testpublic void testLocalClass() {// 定义局部类class LocalClass {}assertThat(LocalClass.class.isLocalClass()).isTrue();}@Testpublic void testAnonymousClass() {Runnable unknownClass = new Runnable() {@Overridepublic void run() {}};assertThat(unknownClass.getClass().isAnonymousClass()).isTrue();}@Testpublic void testMemberClass() {assertThat(UserInfoEntity.class.isMemberClass()).isFalse();assertThat(InnerClass.class.isMemberClass()).isTrue();assertThat(StaticInnerClass.class.isMemberClass()).isTrue();// 定义局部类class LocalClass {}assertThat(LocalClass.class.isMemberClass()).isFalse();// 匿名类Runnable unknownClass = new Runnable() {@Overridepublic void run() {}};assertThat(unknownClass.getClass().isMemberClass()).isFalse();}@Testpublic void testGetModifiers() {assertThat(Modifier.isPublic(UserInfoEntity.class.getModifiers())).isTrue();assertThat(Modifier.isProtected(UserInfoEntity.class.getModifiers())).isFalse();assertThat(Modifier.isPrivate(UserInfoEntity.class.getModifiers())).isFalse();assertThat(Modifier.isAbstract(UserInfoEntity.class.getModifiers())).isFalse();assertThat(Modifier.isInterface(UserInfoEntity.class.getModifiers())).isFalse();assertThat(Modifier.isStatic(UserInfoEntity.class.getModifiers())).isFalse();assertThat(Modifier.isFinal(UserInfoEntity.class.getModifiers())).isFalse();assertThat(Modifier.isNative(UserInfoEntity.class.getModifiers())).isFalse();}@Testpublic void testStaticInnerClass() {assertThat(Modifier.isStatic(StaticInnerClass.class.getModifiers())).isTrue();}@Testpublic void testInnerClass() {assertThat(InnerClass.class.isMemberClass() && !Modifier.isStatic(InnerClass.class.getModifiers())).isTrue();}private static class StaticInnerClass { }private class InnerClass { }@Testpublic void testTypeConvert() {assertThat(UserInfoEntity.class.isInstance(new UserInfoEntity(1L))).isTrue();assertThat(BaseEntity.class.isInstance(new UserInfoEntity(1L))).isTrue();assertThat(UserInfoEntity.class.isAssignableFrom(UserInfoEntity.class)).isTrue();assertThat(BaseEntity.class.isAssignableFrom(UserInfoEntity.class)).isTrue();assertThat(BaseEntity.class.cast(new UserInfoEntity(1L))).isNotNull();assertThatExceptionOfType(ClassCastException.class).isThrownBy(() -> BaseEntity.class.cast(1));}
}

单元测试类中定义了两个内部类:静态内部类StaticInnerClass、内部类InnerClass;

单元测试方法介绍:

testGetName获取类名称,其中getSimpleName用于获取简略名称,getName用于获取全限类名,getPackage用于获取包对象

testPrimitive判断是否是基本数据类型,使用isPrimitive方法判断是否是基本数据类型(byte,short,int,long,float,double,Boolean,void)

testArray判断并获取数组元素类型,使用isArray判断是否是数组类型,使用getComponentType获取数组元素类型

testEnum判断并获取枚举常量数组,使用isEnum判断是否是枚举类型,使用getEnumConstants获取枚举常量数组

testAnnotation判断是否是注解类型,使用isAnnotation判断是否是注解类型

testLocalClass判断是否是局部类,使用isLocalClass判断是否是局部类

testAnonymousClass判断是否是匿名类,使用isAnonymousClass判断是否是匿名类

testMemberClass判断是否是成员类,使用isMemberClass判断是否是成员类,内部类、静态内部类都属于成员类,局部类、匿名类都不属于成员类

testGetModifiers获取修饰符,使用getModifiers获取修饰符,并使用Modifier类提供的静态方法依次判断了是否使用了public、protected、private、abstract、interface、static、final、native等修饰符

testStaticInnerClass判断是否是静态内部类,使用getModifiers获取修饰符,并使用Modifier类提供的静态方法判断是否使用了static修饰符

testInnerClass判断是否是内部类,判断是否是成员类并且没有使用static修饰符

testTypeConvert类型判断与转换,使用isInstance或isAssignableFrom可以判断类型是否可以转换,使用cast可以进行类型的转换。

相关文章:

【反射】Class类

Class类中包含了类定义的详细信息&#xff0c;可以使用Class类中提供的方法来获取&#xff0c;下面我们先获取Class对象&#xff0c;再介绍Class类中提供的获取类信息的方法。 一、准备工作 在src/test/java目录的cn.horse.reflect.entity包下新建BaseEntity类、UserInfoEnti…...

PyQt 问题记录

1.现成的组件不一定线程安全&#xff0c;&#xff08;包括且不限于数据的修改竞争,和一些组件的崩溃 ) 对于PyQt 的线程使用&#xff0c;可能还需要更谨慎些 保存逻辑 QuestionBox("保存/Save")def Save(self):okFlagFalseerrFlagFalseWriteCmd{}for it in self.Mode…...

云安全—责任共担

0x00 前言 云安全的职责范围实际上一直遵循的是&#xff0c;谁提供谁负责&#xff0c;如果交付给云消费者的时候&#xff0c;交付者使用过程中就要自行负责&#xff0c;也就是我们经常遇到的配置不当等问题&#xff0c;在三层服务模式中&#xff0c;责任互相嵌套&#xff0c;最…...

使用Vscode终端设置window环境变量设置不上

问题描述 在Vscode中打开了一个终端&#xff0c;然后输入 set ENVprod, 但是我使用node 的proces.env.ENV并没有获取到 问题原因 可能是Vscode终端的问题&#xff0c;可以通过电脑自带的CMD去设置环境变量&#xff0c;通过echo查看&#xff0c;发现是没有问题的。...

【微信小程序】自定义组件布局会议OA其他页面(附源码)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…...

如何使用 MiniGPT-v2

MiniGPT-v2 是一个基于视觉语言模型&#xff08;LLM&#xff09;的多任务学习系统。它可以用于各种视觉语言任务&#xff0c;包括图像描述、图像识别、图像-文本对话等。 本文将介绍如何使用 MiniGPT-v2。 MiniGPT-v2 提供了一个简单的在线演示&#xff0c;可以用于测试模型。…...

python -pandas -处理excel合并单元格问题

对于合并的单元格&#xff0c;不进行处理情况下&#xff0c;会默认输出nan问题 解决方法&#xff1a; class A(object):def __init__(self, xlsx_file_path, sheet_index):self.xlsx_file FileDataProcesser.read_excel(xlsx_file_path, sheet_index)self.sheet_data self.…...

KT6368A的封装怎么画 原理图怎么画 资料怎么看 怎么下载呢

一、简介 KT6368A的封装怎么画 原理图怎么画 资料怎么看 怎么下载呢 也有好几个客户问我们这样的问题&#xff0c;实在是太难了 但是没办法&#xff0c;客户就是上帝&#xff0c;也只能选择认真的回答&#xff0c; 这里对这类型的问题进行统一精细化回复&#xff0c;高手请…...

Linux杀掉僵尸进程方法

说明&#xff1a; 一般在使用pytorch训练网络模型时&#xff0c;可能会不正确的终端训练&#xff0c;导致进程僵尸&#xff0c;GPU依然被占用的情况。 解决办法&#xff1a; 查看进程的ID及其父进程ID指令&#xff1a; ps -ef | grep defunct | more假设输出如下&#xff1a…...

uniapp(uncloud) 使用生态开发接口详情1(创建项目)

开发接口对比时间: 用java开发接口周期太长, 大概5-6个月左右 用php 开发接口周期同样太长, 大概3-4个月左右 用node.js 开发接口周期相对短一点, 大概1-2个月左右 用uniapp 开发接口, 可以不到 1-2周的时间 这里我使用 uniapp 开发接口, 废话不多说了,直接开干 HBuilder官网(…...

Linux内核8. Linux内核的经典调试方式

1 内核调试以及工具总结 内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试. 内核的调试, 其本质是内核空间与用户空间的数据交换, 内核开发者们提供了多样的形式来完成这一功能. 2 用户…...

react中如何对props传的参数进行必要的限制

目录 一&#xff1a;总结 二&#xff1a;实现步骤 2.1 安装需要的库 2.2 对props 进行参数限制 3.3 俩种属性限制 3.1 设置静态属性 3.2 设置默认属性值 一&#xff1a;总结 1&#xff1a;react中的 props 用于给组件传递属性&#xff0c;对所传递的属性可以作以下三种限…...

Jmeter —— 接口之间关联调用(获取上一个接口的返回值作为下一个接口的请求参数)

正则表达式&#xff1a; 具体如何操作&#xff1a; 1. 草稿保存&#xff0c; 此请求的响应数据的id 为发布总结的请求参数draft_id 2. 草稿保存的响应数据 3.在草稿保存的请求中&#xff0c;添加后置处理器- 正则表达式提取器&#xff0c; 提取响应数据的id信息 4. 发布总结请…...

Python 机器学习入门之K-Means聚类算法

系列文章目录 第一章 Python 机器学习入门之线性回归 K-Means聚类算法 系列文章目录前言一、K-Means简介1、定义2、例子3、K-Means与KNN 二、 K-Means实现1、步骤2、优化2.1 初始化优化之K-Means2.2 距离优化之elkan K-Means 三、优缺点1、优点2、缺点 前言 学完K近邻算法&a…...

【jmeter】接口测试流程

1、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独…...

RTOS(6)任务管理

任务状态理论 我们是怎么实现&#xff0c;两个同优先级的任务之间交替执行的呢&#xff1f; 任务切换的基础&#xff1a;tick中断&#xff01; tick为1ms一个周期&#xff0c;可以通过修改时钟配置修改&#xff1b; running&#xff1a;正在进行的任务3为running&#xff…...

【UE5】 ListView使用DataTable数据的蓝图方法

【UE5】 ListView使用DataTable数据的蓝图方法 ListView 是虚幻引擎中的一种用户界面控件&#xff0c;用于显示可滚动的列表。它可以用于显示大量的数据&#xff0c;并提供了各种功能和自定义选项来满足不同的需求。 DataTable是虚幻引擎中的一种数据表格结构&#xff0c;用于存…...

Anthropic全球上线AI语言模型Claude 2;多模态系统:融合文本和图像的新前沿

&#x1f989; AI新闻 &#x1f680; Anthropic全球上线AI语言模型Claude 2&#xff0c;编程、数学、推理能力大幅提升 摘要&#xff1a;Anthropic在全球正式上线了AI语言模型Claude 2。相比前代版本&#xff0c;Claude 2在编程、数学、推理等方面都有大幅提升&#xff0c;支…...

pdf压缩文件怎么压缩最小?

pdf压缩文件怎么压缩最小&#xff1f;我们很多项目介绍或是学术的报告都是采用的这个pdf格式&#xff0c;那么我们在存储或是需要进行分享的时候&#xff0c;可能就会因为文件过大而导致无法打开或是发送了。那么就需要将其进行压缩。PDF文件压缩方法很多&#xff0c;pdf压缩文…...

开源智能体来啦!港大团队发布OpenAgents,可以搞数据分析、聊天、支持200+插件

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 港大的研究团队最近发布了一个新的开源 Agent 框架&#xff0c;名为 OpenAgents. 它可以用于实际用户场景&#xff0c;特别是在使用自然语言执行复杂任务的情况下。先前的语言智能体框架主要关注概念验证或者供开发人员使用&…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...