Java如何通过反射机制获取数据类对象的属性及方法

2025-01-20 04:50

本文主要是介绍Java如何通过反射机制获取数据类对象的属性及方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一...

一、通过反射机制获取类对象的所有属性以及相应的get、set方法

1.遍历类对象的所有属性

//可以使用getDeclaredFields()方法获取对象的所有属性
AutoClass autoClass = new AutoClass();		// 先初始化一个类
Field[] fields = autoClass.getClass().getDeclaredFields();	// 获取对象的所有属性
for (Field item : fields) {
    String name = item.getName();	// 获取对象属性名
    String typeName = item.getGenericType().getTypeName();	// 获取对象属性的类型
    System.out.printf("属性名:%s,类型:%s\n", name, typeName);
}

2.获取属性的get、set方法

// 一般而言每个属性都有其get和set方法
// 通过方法名获取get方法
Method getMethod = autoClass.getClass().getMethod("getId");
// 调用get方法
String invoke = (String) getMethod.invoke(autoClass);
System.out.println(invoke);
// 通过方法名获取set方法,由于set方法是有参数的,所以这里也需要定义set方法的参数类型
Method setMethod = autoClass.getClass().getMethod("setId", String.class);
// 调用set方法
setMethod.invoke(autoClass, "gftz");
System.out.println(autoClass.getId());
// invoke方法中的autoClass表示autoClass这个指定对象调用相应方法

二、通过反射机制实现类对象的实例化

1.工具类

package utils;
import Java.lang.reflect.InvocationTarChina编程getException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @description: 数据类的相关操作
 * @author: 黄珺瑜
 * @create: 2022-07-07 22:05
 **/
// 由于为了让这个工具类能够通用,故而用了泛型,对其不了解需要自行百度一下。
public class ObjectOperate<T> {
/**
 * 设置数据类对象的属性
 * @param obj   数据类对象的实例
 * @param name  属性名
 * @param type  属性类型名
 * @param val   需要存入的属性值
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 * @throws IllegalAccessException
 */
    public void setValues(T obj, String name, String type, Object val) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method method = null;
        // 通过属性类型来获取相应的方法以及强制转化属性值并初始化相应属性
        // 这里考虑到了大部分常用的数据类型,可拿来即用。
        switch (type){
            case "int":
                method = obj.getClass().getMethod(name, int.class);
                method.invoke(obj,(int)val);
                break;
            case "short":
                method = obj.getClass().getMethod(name, short.class);
                method.invoke(obj,(short)val);
                break;
            case "long":
                method = obj.getClass().getMethod(name, long.class);
                method.invoke(obj,(long)val);
                break;
            case "float":
                method = obj.getClass().getMethod(name, float.class);
                method.invoke(obj,(float)val);
                break;
            case "double":
                method = obj.getClass().getMethod(name, double.class);
                method.invoke(obj,(double)val);
                break;
            case "boolean":
                method = obj.getClass().getMethod(name, boolean.class);
                method.invoke(obj,(boolean)val);
                break;
            case "java.lang.String":
                method = obj.getClass().getMethod(name, String.class);
                method.invoke(obj,(String)val);
                break;
            case "java.util.Date":
                method = obj.getClass().getMethod(name, Date.class);
                method.invoke(obj,(Date)val);
                break;
            case "java.math.BipythongDecimal":
 oyvNYZfdab               method = obj.getClass().getMethod(name, BigDecimal.class);
                method.invoke(obj,(BigDecimal)val编程China编程);
                break;
        }
    }
}

2、使用案例

// 模拟案例数据
List<Object> params = new ArrayList<>();
params.add(UUID.randomUUID().toString().replaceAll("-", ""));
params.add(18);
params.add(new Date());
params.add(false);
params.add(new BigDecimal(888888.8));
// 初始话类型操作的工具类
ObjectOperate<AutoClass> objectOperate = new ObjectOperate<>();
// AutoClass使用到上面的,故不再给出AutoClass类
AutoClass autoClass = new AutoClass();
Field[] fields = autoClass.getClass().getDandroideclaredFields();
for (int i = 0; i < fields.length; i++) {
    String name = fields[i].getName();	// 属性名
    // 设置为属性的set方法名,如:属性名为id,对应set方法名为setId
    name = "set"+name.substring(0, 1).toUpperCase() + name.substring(1);
    String typeName = fields[i].getGenericType().getTypeName();	//属性类型名
    try {
        objectOperate.setValues(autoClass,name,typeName,params.get(i));	// 初始化对象的属性
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
System.out.println(autoClass.toString());

到此这篇关于Java如何通过反射机制获取数据类对象的属性及方法的文章就介绍到这了,更多相关java反射获取数据类对象的属性内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java如何通过反射机制获取数据类对象的属性及方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153138

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte