根据反射和属性名称进行set方法调用

编程

通过反射和属性键值对调用一个通用的方法,实现对象的属性进行赋值,这样就可以避免很多重复代码了。

    

以下是我实现的三种方式:

方式一:
代码中通过方法set前缀和后缀匹配的方式获得需要调用的set方法。

public static <C> void setValueByFieldName(C c, Map<String, Object> fieldAndValues) throws Exception {

List<Method> methods = Arrays.stream(c.getClass().getMethods())

.filter(m -> m.getName().startsWith("set")

&& fieldAndValues.containsKey(m.getName().substring(3, 4).toLowerCase() + m.getName().substring(4))

).collect(Collectors.toList());

for (Method m : methods) {

m.invoke(c, fieldAndValues.get(m.getName().substring(3, 4).toLowerCase() + m.getName().substring(4)));

}

}

 

方式二:
通过Field名称和key一致,调用Field.set方法

public static <C> void setValueByFieldName_(C c, Map<String, Object> fieldAndValues) throws Exception {

List<Field> fields = Arrays.stream(c.getClass().getDeclaredFields())

.filter(f -> fieldAndValues.containsKey(f.getName()))

.collect(Collectors.toList());

for (Field field : fields) {

field.setAccessible(true);

field.set(c, fieldAndValues.get(field.getName()));

}

}

通过Field名称一致的方式获得需要调用set方法的Field列表,然后调用其set方法进行赋值

 

方式三:
通过Class对象获得类的结构信息,然后获得所有属性列表,通过属性获得WriteMethod进行赋值。

public static <C> void setValueByFieldName__(C c, Map<String, Object> fieldAndValues) throws Exception {

BeanInfo beanInfo = Introspector.getBeanInfo(c.getClass());

List<PropertyDescriptor> properties = Arrays.stream(beanInfo.getPropertyDescriptors())

.filter(f -> fieldAndValues.containsKey(f.getName())).collect(Collectors.toList());

for (PropertyDescriptor property : properties) {

Method setMethod = property.getWriteMethod();

if (setMethod != null) {

setMethod.invoke(c, fieldAndValues.get(property.getName()));

}

}

}

说明:
c:是需要进行属性赋值的对象;
fieldAndValues:是需要赋值属性名称的键值对。

以上是我实现的三种方式,如有更好的方式,欢迎探讨提携……

 

以上是 根据反射和属性名称进行set方法调用 的全部内容, 来源链接: utcz.com/z/514981.html

回到顶部