2

目标 :

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

例子 :

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扩展类中可用的非字段中的所有可用字段设置值。

如何设置?

4

4 回答 4

1

您可以使用Class<SuperClass> superClazz = clazz.getSuperclass();

得到后,得到Field[]使用方法superClazz.getFields()setField

于 2013-04-30T09:01:27.920 回答
1

使用getSuperclass()方法获取超类的类对象。然后以类似的方式获取超类的字段。

于 2013-04-30T09:01:54.377 回答
1

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

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

子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;

}
于 2013-04-30T09:08:34.380 回答
0
obj.getClass().getSuperclass().getDeclaredFields();

您可以使用上述功能来实现相同的..

还检查通过 Java 中的反射访问私有继承字段

于 2013-04-30T09:02:30.070 回答