有问有答—JavaSE—反射应用

写一个函数,传入任意的对象,可以将对象里面String类型的属性中的a改成b。

field.getClass()

private void changeField(Object object) throws IllegalAccessException {//1.获得对应的字节码Class clazz = object.getClass();//对象.getClass。  类.class//2.获取所有的fieldsField[] fields = clazz.getDeclaredFields();//所有的  包括私有的//3.遍历所有的field,如果是String类型,将包含a改为bfor (Field field : fields) {//3.1 是String类型才修改if (field.getType() == String.class) {//属性是私有的field.setAccessible(true);//person.getName()//3.2 获得field原来的值String oldValue = (String) field.get(object);if (oldValue == null || "".equals(oldValue)) {continue;}String newValue = oldValue.replace("a", "b");//3.3 将修改后的值设置到field//person.setName("11");field.set(object, newValue);}}
}

1 能不能用field.class == String.class来判断类型是否相等?

在 Java 中,使用 field.getType() == String.class 来判断字段的类型是否为 String 是正确的做法,而 field.class == String.class 则是错误的。原因在于 field 是一个 Field 对象,而不是一个类。field.class 指向的是 Field 类的字节码对象,而不是字段本身的类型。

正确的类型判断方法

要判断字段的类型是否为 String,应该使用 field.getType() 方法。field.getType() 返回的是一个 Class 对象(压根不能这样写),表示该字段的类型。

正确的代码示例
private void changeField(Object object) throws IllegalAccessException {// 1.获得对应的字节码Class<?> clazz = object.getClass(); // 使用对象.getClass 获取类对象// 2.获取所有的 fieldsField[] fields = clazz.getDeclaredFields(); // 获取所有的字段,包括私有字段// 3.遍历所有的 field,如果是 String 类型,将包含 a 改为 bfor (Field field : fields) {// 3.1 是 String 类型才修改if (field.getType() == String.class) { // 正确的类型判断方法// 属性是私有的field.setAccessible(true);// 获取字段的当前值String oldValue = (String) field.get(object);if (oldValue != null) { // 确保旧值不是 nullString newValue = oldValue.replace("a", "b");// 将修改后的值设置到字段field.set(object, newValue);}}}
}

解释

  • field.getType() == String.class:这是正确的判断方法。field.getType() 返回字段的类型 Class 对象,通过比较它与 String.class,可以判断该字段是否是 String 类型。
  • field.class == String.class:这是错误的,因为 field 是一个 Field 对象,而 field.class 指向的是 Field 类的字节码对象,而不是字段的类型。

其他注意事项

  1. 检查旧值是否为 null:
    在使用 oldValue.replace("a", "b") 之前,应该检查 oldValue 是否为 null,以避免 NullPointerException。

  2. 设置字段的可访问性:
    使用 field.setAccessible(true) 来访问私有字段。完成后,最好将其恢复为不可访问状态(可选)。

  3. 异常处理:
    确保捕获和处理所有可能的异常,尤其是在反射操作中。

总结

在反射操作中,判断字段类型应该使用 field.getType() == String.class。直接比较 field.class 与 String.class 是不正确的,因为 field 是 Field 类的实例,而不是表示字段的类型。通过正确的方法,可以有效地操作对象的字段,实现所需的功能。

2 field.getClass行不行?

field.getClass() 不能用于判断字段的类型是否为 String。让我们更详细地解释原因并提供适当的方法。

详细解释

  • field.getClass():

    • field 是一个 Field 对象,因此 field.getClass() 返回的是 Field 类的 Class 对象。这并不是字段的类型,而是 Field 类本身的类型。
    • 换句话说,field.getClass() 始终返回的是 Field.class,无论该 Field 对象表示的是 String 类型的字段还是其他类型的字段。
  • field.getType():

    • field.getType() 返回的是这个字段的类型。例如,如果字段是 String 类型,则 field.getType() 返回 String.class。

示例代码和比较

错误的用法
if (field.getClass() == String.class) {// 这段代码永远不会为 true,因为 field.getClass() 返回的是 Field.class
}
正确的用法
if (field.getType() == String.class) {// 这段代码会在字段类型为 String 时为 true
}

完整示例

以下是如何正确判断字段是否为 String 类型的完整代码示例:

import java.lang.reflect.Field;public class ReflectDemo {public static void main(String[] args) throws IllegalAccessException {Student student = new Student();student.setName("aName");student.setAge(20);changeField(student);System.out.println("Updated student: " + student);}private static void changeField(Object object) throws IllegalAccessException {// 1.获得对应的字节码Class<?> clazz = object.getClass();// 2.获取所有的 fieldsField[] fields = clazz.getDeclaredFields();// 3.遍历所有的 field,如果是 String 类型,将包含 a 改为 bfor (Field field : fields) {// 3.1 是 String 类型才修改if (field.getType() == String.class) { // 正确的类型判断方法// 属性是私有的field.setAccessible(true);// 获取字段的当前值String oldValue = (String) field.get(object);if (oldValue != null) { // 确保旧值不是 nullString newValue = oldValue.replace("a", "b");// 将修改后的值设置到字段field.set(object, newValue);}}}}static class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{name='" + name + "', age=" + age + '}';}}
}

关键点

  • field.getClass():返回 Field 对象的类,即 Field.class,无法用于判断字段的类型。
  • field.getType():返回字段的实际类型,可以用于判断字段是否为 String 类型。

通过使用 field.getType(),可以正确地判断字段的类型并实现所需的逻辑操作。

3 .class和.getClass()的测试

package com.sdust.day37;public class Teacher {private String name = "android";private int age = 18;private String address = "qingdao";@Overridepublic String toString() {return "Teacher [name=" + name + ", age=" + age + ", address="+ address + "]";}
}
@Test
public void testPointClass() {System.out.println(String.class);System.out.println("----------------------");Class clazz = Teacher.class;Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {System.out.println(field.getClass());System.out.println(field.getType());}
}
class java.lang.String
----------------------
class java.lang.reflect.Field
class java.lang.Stringclass java.lang.reflect.Field
intclass java.lang.reflect.Field
class java.lang.String

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Openfeign远程调用

在实际开发中&#xff0c;Openfeign远程调用要避免在循环中使用&#xff0c;这个是比较耗时的。如使用不当可能会把远程服务压垮。正确的用法是在循环外一次查询获得条件的Map集合&#xff0c;然后在循环里边通过给map传入key&#xff0c;从而获得map对应的值&#xff0c;从而避…

微信小程序-案例:本地生活-首页(不使用网络数据请求)

一、 1.页面效果&#xff1a; 二、 1.新建项目并添加页面 在app.json文件中&#xff1a; "pages": ["pages/home/home","pages/message/message","pages/contact/contact"] 2.配置导航栏效果 在app.json文件中&#xff1a; &quo…

yolov8-obb 旋转目标检测 瑞芯微RKNN芯片部署、地平线Horizon芯片部署、TensorRT部署

特别说明&#xff1a;参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 折腾旋转目标检测的小伙伴们看过来&#xff0c;yolov8旋转目标检测部署…

力扣 41.缺少的第一个正整数

题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 …

【文末附gpt升级秘笈】Fast-DetectGPT:机器生成文本与人类撰写文本的区别检测研究

Fast-DetectGPT&#xff1a;机器生成文本与人类撰写文本的区别检测研究 摘要&#xff1a; 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;机器生成文本的质量日益提高&#xff0c;使得区分机器生成文本与人类撰写文本成为了一个挑战。西湖大学张岳教授团队近期在这…

趣测小程序开发搭建,趣测趣玩小程序是何物?

一、趣测小程序简介 趣测趣玩小程序是一款提供趣味测试和玩乐功能的应用程序。用户可以通过该小程序参与各种有趣的测试&#xff0c;这些测试可能涵盖性格、情感、智力等多个方面&#xff0c;旨在为用户提供轻松愉快的体验。同时&#xff0c;该小程序还可能包含一些游戏元素&a…

8086 汇编笔记(十):标志寄存器

前言 一、ZF 标志 Zero Flag&#xff0c;零标记位。用于记录相关指令执行后&#xff0c;其结果是否为 0。如果结果为 0&#xff0c;则 ZF1&#xff0c;如果结果非 0&#xff0c;则 ZF0 mov ax,1 sub ax,1 ;ZF 1 mov ax,2 sub ax,1 ;ZF0 二、PF 标志 Parity Flag&a…

AutoCAD记录

esc&#xff1a;取消&#xff08;取消操作&#xff09; L空格&#xff1a;画直线 C空格&#xff1a;画圆 &#xff08;软件提供了圆的多种画法&#xff0c;其中包括与其他图形的切线&#xff09; A空格&#xff1a;画圆弧 tab&#xff1a;切换数据输入框&#xff08;如下图…

安卓手机APP开发_____通过设备管理政策增强安全性

安卓手机APP开发_____通过设备管理政策增强安全性 目录 概述 定义并声明政策 创建设备管理接收器 激活设备管理器 实现设备政策控制器 概述 设备管理弃用。部分管理员政策在由设备管理员调用时被标记为已弃用。 如需了解详情并查看迁移选项&#xff0c;请参阅 设备管理弃…

等保测评3级-技术测评要求 上

技术测评要求(S3A3G3) 等保测评3级技术评测要求 等级保护三级技术类测评控制点(S3A3G3)类别 序号 10. 11. 12. 13. 防雷 击 14. 15. 16. 防火 17. 18. 19. 防水 和防 潮 20. 21. 22. 测 评 内 容 应对介质分类标识&#xff0c; 存储在介质库或档案室中。 (G2) 应利用光、电等…

Renesas MCU之串口的发送接收功能实现

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 硬件介绍 2 FSP配置项目 2.1 项目参数配置 2.2 配置UART参数 3 功能实现 3.1 软件架构实现 3.2 UART接口函数 3.2.1 R_SCI_UART_Open() 3.2.2 R_SCI_UART_Close() 3.2.3 R_SCI_UART_Read() 3.2.4 R_SCI_UART_Writ…

java自学阶段二:JavaWeb开发50(Spring和Springboot学习)

Spring、Springboot基础知识学习 目录 学习目标Spring基础概念IOC控制反转DI依赖注入事务管理AOP面向切面编程Spring案例说明&#xff08;Postman使用、Restful开发规范、lombok、Restful、nginx了解&#xff09; 一&#xff1a;学习目标&#xff1a; 1&#xff09;了解Sprin…

如何解决chatgpt出现503 bad gateway的问题

昨日&#xff0c;ChatGPT官网挂了&#xff0c;也就是使用web网页端访问的用户&#xff0c;会出现 bad gateway 情况。我们去ChatGPT官方的监控查看&#xff0c;已经展示相关错误。 影响的范围有&#xff1a; 影响了 ChatGPT 所有计划的所有用户。影响包括所有与 ChatGPT 相关…

Spring ApplicationContext的getBean方法

Spring ApplicationContext的getBean方法 在Spring框架的ApplicationContext中&#xff0c;getBean(Class<T> requiredType)方法可以接受一个类类型参数&#xff0c;这个参数可以是接口类也可以是实现类。 使用接口类&#xff1a; 如果requiredType是一个接口&#xff0c…

React:Expected property name or ‘}‘ in JSON at position 1

代码&#xff1a; import { Form, Input, Button } from antd export default function FormCom() {function onFinish(a, b, c, d) {console.log(a, b, c, d)}const describe "{tip:请输入用户名}"return (<><Form onFinish{onFinish}><Form.Itemn…

如何利用langchian调用百度大模型API

Baidu AI Cloud Qianfan Platform 使用LangChain进行聊天模型集成 概述 百度智能云的乾帆平台是一个一站式的大模型开发和服务运营平台&#xff0c;为企业开发者提供了包括文心一言&#xff08;ERNIE-Bot&#xff09;和第三方开源模型在内的多种模型。主要分为三类模型&#…

小程序真题合集

小程序真题合集 1. 微信小程序主要目录和文件的作用2. 微信小程序的生命周期函数2.1 应用&#xff08;App&#xff09;的生命周期2.2 小程序页面&#xff08;Page&#xff09;的生命周期 3. 微信小程序的登陆流程4. 微信小程序中路由跳转的方式5. 谈谈wxml与标准的html的异同6.…

【Linux】(六)—— vim编辑器

vim文件编辑器 Vim&#xff08;Vi Improved&#xff09;是一个高度可配置的文本编辑器&#xff0c;最初基于UNIX下的Vi编辑器发展而来&#xff0c;广泛用于程序开发和系统管理中。vim编辑器可以只通过终端命令即可编写修改文件&#xff0c;不需要和gedit一样需要打开类似于记事…

1V1音视频实时互动直播系统

李超老师的项目 先肯定分为两个两个端&#xff0c;一个是服务器端一个是客户端。客户端用于UI界面的显示&#xff0c;服务器端用于处理客户端发来的消息。 我们先搭建stun和turn服务器 首先介绍一下什么是stun协议&#xff0c; 它是用来干什么的&#xff1f; stun协议存在…

【深度学习】之 卷积(Convolution2D)、最大池化(Max Pooling)和 Dropout 的NumPy实现

1. 2D 卷积操作 import numpy as npdef conv2d(image, kernel, stride1, padding0):"""应用2D卷积操作到输入图像上。参数&#xff1a;- image: 输入图像&#xff0c;2D数组。- kernel: 卷积核&#xff0c;2D数组。- stride: 卷积步幅。- padding: 图像周围的零…