Java反射-如何为从1和2扩展的类设置值
目标:Java反射-如何为从1和2扩展的类设置值,java,dynamic,reflection,javabeans,Java,Dynamic,Reflection,Javabeans,目标: public class CreateRequisitionRO extends AbstractPortfolioSpecificRO {....} 设置类字段以及扩展类字段的值 示例: public class CreateRequisitionRO extends AbstractPortfolioSpecificRO {....} 我可以为createrequisionro设置值,但无法为正在扩展的AbstractPortfolioSpecificRO设置值 这是我设置值的方
public class CreateRequisitionRO extends AbstractPortfolioSpecificRO {....}
设置类字段以及扩展类字段的值
示例:
public class CreateRequisitionRO extends AbstractPortfolioSpecificRO {....}
我可以为createrequisionro
设置值,但无法为正在扩展的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;
}
上述方法为createrequisionro
中可用的所有字段设置值,而不是为扩展类中可用的字段设置值
如何设置它?您可以使用
classsuperclazz=clazz.getSuperclass()获得类的超类代码>
获取后,使用superClazz.getFields()
获取字段[]
,并使用Field的set
方法使用getSuperclass()
方法获取超类的类对象。然后以类似的方式得到超类的字段
obj.getClass().getSuperclass().getDeclaredFields();
您可以使用上述功能来实现相同的功能
同时选中您可以使用clazz.getSuperclass()
检索createrequisionro
的超类型。一旦有了超类型AbstractPortfoliosSpecificRo
的句柄,就可以迭代它的字段。我建议将所有这些字段存储在列表中
。遍历此列表并根据条件逻辑设置字段
我提供了一个如何执行此操作的快速示例。在我的示例中,Child
扩展了Parent
。递归的getFields
方法返回一个列表
,其中包含子项
的所有字段。然后我遍历列表
设置每个列表的值。请注意,我必须切换私有字段的可访问性
Child.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;
}
}
public class Parent {
private String x;
public String y;
protected String z;
}
谢谢你的解释。我会这样做,并将此标记为答案,因为这也会帮助其他人。@Anto很高兴我能帮上忙。如果您还有任何问题,请告诉我。Kevin当我使用getSuperclass()时,我只会得到如下userId
这样的字段名.
但是我需要像private java.lang.String com.hexgen.ro.request.createrequisionro.customedin
一样,是否可能getDeclaredFields
也应该拉取私有字段。让我们来看看你应该把这个检查与其他检查打包:如果(!Modifier.isFinal(f.getModifiers())
而不是反复进行相同的检查