Java对象如何像JavaScript对象那样动态增加属性
JS对象动态增加属性
// 在js中:如果我们直接想为对象增加一个属性,直接obj.xxx="xxx"就行了
let obj = {
name:'泰勒',
sex:'女',
age:22
}
obj.county="美国" //这样obj对象就有一个county属性了
Java对象可以做到吗?
Java对象可以利用Map来仿造达到类似的目的(并不是完全和JS过程相同)
Person对象
我想给这个Person增加一个country属性,值是String类型;
这是出于前后端交互的需要.
@Data //省略对象的getter、setter、有参、无参构造、toString
public class Person {
private String name; //姓名
private String sex; //性别
private int age; //年龄
}
DynamicPropertiesUtil
这是一个工具类,利用反射和Map动态为对象增加属性(避免再次创建VO来前后端交互)
/**
* @作者 Forest Hoo
* @日期 2023-02-12 15:27
*/
public class DynamicPropertiesUtil {
/**
* 给一个对象动态增加属性,最终返回Object类型,给前端展示
* @param person
* @param key
* @param value
* @return
*/
public static Map objAddProperty(Object person, String key, String value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//准备
Class<?> personClass = person.getClass();
Field[] fields = personClass.getDeclaredFields();
Map map = new HashMap();
//处理
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
String typeName = field.getGenericType().getTypeName();
Object fieldValue = field.get(person);
System.out.println("属性名:"+fieldName+",类型:"+typeName+",值:"+ fieldValue);
map.put(fieldName,fieldValue);
}
map.put(key,value);
//返回
return map;
}
}
测试类
/**
* @作者 Forest Hoo
* @日期 2023-02-12 15:24
*/
public class ReflectTest {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Person person = new Person("泰勒", "女", 22);
Map map = DynamicPropertiesUtil.objAddProperty(person, "county", "美国");
map.forEach((key,value)->{
System.out.println(key+":"+value);
});
}
}
下面是打印结果,原来的person类新增了一个county属性;可以直接把Map转成JSON返回给前端,结果是一样的