有问有答—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.classString.class 是不正确的,因为 fieldField 类的实例,而不是表示字段的类型。通过正确的方法,可以有效地操作对象的字段,实现所需的功能。

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.mzph.cn/bicheng/23184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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: 图像周围的零…