Java 获取类的属性数组 & 获取属性值 & 设置属性值

本文介绍了如何在Java中使用反射获取类的属性数组,以及如何通过实例对象获取和设置属性值。通过示例代码展示了获取属性值和设置属性值的方法,并提供了一个应用案例,涉及TicketOrder类及其相关对象的操作。
摘要由CSDN通过智能技术生成

Java 获取类的属性数组 & 获取属性值 & 设置属性值

一、知识点简介

1、获取类的属性数组

Field[] fields = TicketOrder.class.getDeclaredFields(); // 获取类的属性数组
for (Field f : fields) {
    System.out.println(f.getName()); // 打印属性名
}

2、获取属性值:通过实例对象和属性名的方式获取属性值

    /**
     * 获取属性值:通过实例对象和属性名的方式获取属性值
     *
     * @param obj 实例对象
     * @param fieldName 属性名
     * @return
     */
    public static Object getFieldValueByName(Object obj, String fieldName) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = obj.getClass().getMethod(getter, new Class[]{});
            Object value = method.invoke(obj, new Object[]{});
            return value;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    }

3、设置属性值:通过实例对象、属性名和属性值的方式设置属性值

    /**
     * 设置属性值:通过实例对象、属性名和属性值的方式设置属性值
     *
     * @param obj 实例对象
     * @param fieldName 属性名
     * @param value 属性值
     */
    public static void setFieldValueByName(Object obj, String fieldName, Object value) {
        try {
            // 获取obj类的字节文件对象
            Class c = obj.getClass();
            // 获取该类的成员变量
            Field f = c.getDeclaredField(fieldName);
            // 取消语言访问检查
            f.setAccessible(true);
            // 给变量赋值
            f.set(obj, value);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

二、应用案例

package com.hk.utils;

import com.hk.server.ServerMainClass;
import com.hk.server.dao.TicketOrderDao;
import com.hk.server.entity.TicketOrder;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;

/**
 * @author: shipleyleo
 * @create: 2023-06-08 17:19:00
 */
public class GetAndSetField {

    /**
     * 获取属性值:通过实例对象和属性名的方式获取属性值
     *
     * @param obj 实例对象
     * @param fieldName 属性名
     * @return
     */
    public static Object getFieldValueByName(Object obj, String fieldName) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = obj.getClass().getMethod(getter, new Class[]{});
            Object value = method.invoke(obj, new Object[]{});
            return value;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    }

    /**
     * 设置属性值:通过实例对象、属性名和属性值的方式设置属性值
     *
     * @param obj 实例对象
     * @param fieldName 属性名
     * @param value 属性值
     */
    public static void setFieldValueByName(Object obj, String fieldName, Object value) {
        try {
            // 获取obj类的字节文件对象
            Class c = obj.getClass();
            // 获取该类的成员变量
            Field f = c.getDeclaredField(fieldName);
            // 取消语言访问检查
            f.setAccessible(true);
            // 给变量赋值
            f.set(obj, value);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static void main(String[] args) throws NoSuchFieldException {
        TicketOrderDao dao = ServerMainClass.ticketOrderDao; // 获取订单 DAO
        HashSet hs = (HashSet) dao.getAllTicketOrder(); // 获取全部订单
        ArrayList arr = new ArrayList(); // 创建集合
        arr.addAll(hs); // 设置到 List 集合中


        Field[] fields = TicketOrder.class.getDeclaredFields(); // 获取类的属性数组
        // 测试获取属性值
        for (Object o : arr) {
            TicketOrder item = (TicketOrder) o;
            for (Field f : fields) {
                // 获取属性值
                System.out.println(f.getName() + ":" + getFieldValueByName(item, f.getName()) + "\t"); // 属性名:属性值
            }
            System.out.println();
        }

        // 测试设置属性值,然后再重新获取属性值
        System.out.println();
        for (Object o : arr) {
            TicketOrder item = (TicketOrder) o;
            for (Field f : fields) {
                // 设置属性值
                switch (f.getType().getSimpleName()) {
                    case "int":
                    case "Integer":
                        setFieldValueByName(item, f.getName(), 123);
                    case "long":
                    case "Long":
                        setFieldValueByName(item, f.getName(), 123L);
                        break;
                    case "String":
                        setFieldValueByName(item, f.getName(), "abc");
                        break;
                    case "Calendar":
                        setFieldValueByName(item, f.getName(), Calendar.getInstance());
                        break;
                    default:
                        setFieldValueByName(item, f.getName(), null);
                }
                // 重新获取属性值
                System.out.println(f.getName() + ":" + getFieldValueByName(item, f.getName()) + "\t"); // 属性名:属性值
            }
            System.out.println();
        }
    }
}

输出结果:

oid:1	
passengerName:2	
passengerId:3	
cabinclass:4	
tickettype:5	
cal:java.util.GregorianCalendar[time=57600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1970,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=2,DAY_OF_YEAR=2,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]	
branchid:1	
flightid:130765993	


oid:123	
passengerName:abc	
passengerId:abc	
cabinclass:abc	
tickettype:abc	
cal:java.util.GregorianCalendar[time=1686218537107,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=2,DAY_OF_MONTH=8,DAY_OF_YEAR=159,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=2,SECOND=17,MILLISECOND=107,ZONE_OFFSET=28800000,DST_OFFSET=0]	
branchid:123	
flightid:123
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值