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