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())
而不是反复进行相同的检查