gpt4 book ai didi

Java Reflection - 如何为从一和二扩展的类设置值

转载 作者:行者123 更新时间:2023-12-04 04:59:44 25 4
gpt4 key购买 nike

目标:

设置类字段的值以及扩展类字段

示例:

public class CreateRequisitionRO extends AbstractPortfolioSpecificRO {....}

我可以为 CreateRequisitionRO 设置值但无法为 AbstractPortfolioSpecificRO 设置值正在扩展。

这就是我设置值的方式:
public Object creatObjectWithDefaultValue(String className) throws IllegalArgumentException, IllegalAccessException, InstantiationException {
Class<?> objectClass = null;
Object clsObject =null;
try {
objectClass = Class.forName(className);
clsObject = objectClass.newInstance();
Field[] fields = objectClass.getDeclaredFields();
for(Field f:fields){
if(!f.isAccessible()){
f.setAccessible(true);
Class<?> type = f.getType();
if(! Modifier.isFinal(f.getModifiers()) && type.equals(Integer.class)){
f.set(clsObject, DefaultParamValuesEnum.INTEGER.getDefaultInt());
} else if( !Modifier.isFinal(f.getModifiers()) && type.equals(java.math.BigDecimal.class)){
f.set(clsObject, DefaultParamValuesEnum.BIGDECIMAL.getDdefaultBigDecimal());
} else if(! Modifier.isFinal(f.getModifiers()) && type.equals(org.joda.time.LocalDate.class)){
f.set(clsObject,DefaultParamValuesEnum.DATE.getDefaultDate());
} else if(! Modifier.isFinal(f.getModifiers()) && type.equals(boolean.class)){
f.set(clsObject, DefaultParamValuesEnum.BOOLEAN.getDefaultBoolean());
} else if(! Modifier.isFinal(f.getModifiers()) && type.equals(java.lang.String.class)){
f.set(clsObject, DefaultParamValuesEnum.STRING.getDefaultString());
}
else if(! Modifier.isFinal(f.getModifiers()) && type.equals(long.class)){
f.set(clsObject,DefaultParamValuesEnum.LONGVALUE.getDefaultLong());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return clsObject;
}

这就是我调用上述方法的方式:
classObject.creatJSONObject("com.hexgen.ro.request.CreateRequisitionRO");

上述方式为 CreateRequisitionRO 中所有可用字段设置值不是扩展类中可用的字段。

如何设置?

最佳答案

您可以使用 clazz.getSuperclass()检索 CreateRequisitionRO 的父类(super class)型.一旦你掌握了父类(super class)型 AbstractPortfolioSpecificRO你可以迭代它的字段。我建议将所有这些字段存储在 List<Field> 中。 .遍历此列表并根据您的条件逻辑设置字段。

我提供了一个快速示例来说明如何执行此操作。在我的示例中,Child扩展 Parent .递归 getFields方法返回 List<Field>包含 Child 的所有字段.然后我遍历 List<Field>为每个设置值。请注意,我必须切换私有(private)字段的可访问性。

子.Java

public class Child extends Parent {
public String a;
public String b;


public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
Child child = new Child();
List<Field> fields = getFields(child.getClass());

for(Field f: fields){
f.setAccessible(true);
f.set(child, "Test");
}

for(Field fd: fields){
System.out.println(fd.get(child));
fd.setAccessible(false);
}


}

public static List<Field> getFields(Class<?> clazz){
List<Field> list = new ArrayList<Field>();
list.addAll(Arrays.asList(clazz.getDeclaredFields()));

if(clazz.getSuperclass() != null){
list.addAll(getFields(clazz.getSuperclass()));
}
return list;
}
}

父类.java
public class Parent {
private String x;
public String y;
protected String z;

}

关于Java Reflection - 如何为从一和二扩展的类设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com