2

data 是 MyType 类的 ArrayList,如果只field.get(object)使用代码不会编译说未处理的异常。当我运行它时,我无法访问私人成员。然后我将所有成员字段更改MyType为公共。然后这段代码有效。但是肯定有更好的方法来获取数据吗?

for (Object object : data)//get one object
    {
        ArrayList<Field> fields = 
                new ArrayList<Field>(Arrays.asList(object.getClass().getDeclaredFields()));//get all its fields
        for(Field field : fields)
            {
            try {
                System.out.println(field.get(object));//print its fields value
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }

    }
4

3 回答 3

2

用于Field.setAccessible(true)允许访问私有字段。

try {
       field.setAccessible(true);    
       System.out.println(field.get(object));//print its fields value
     } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
                e.printStackTrace();
     }
于 2013-08-14T06:20:52.510 回答
1

最简洁的方法是要么创建一个接口并从中派生,要么从抽象超类派生。在这两种情况下,编译器都知道构造。您可以通过以下代码获得具有反射的单个字段:

Method.class.getDeclaredField(name)
于 2013-08-14T06:35:13.380 回答
0

您可以使用setAccessible(boolean)on FieldMethodConstructor来访问调用者通常无法访问的非公共成员。这样做将消除您的错误。

更标准化的方法是使用自省。如果该类遵循 JavaBean 约定,那么您可以使用IntrospectorandBeanInfo来获取PropertyDescriptor实例,这使您可以访问 bean 的公共读写方法(getter 和 setter)。例如,这是一个示例 bean:

public class JavaBean {

    private boolean valid;
    private String name;
    private String label;

    public boolean isValid() {
        return valid;
    }

    public String getName() {
        return name;
    }

    public String getLabel() {
        return label;
    }

    public void setValid(boolean valid) {
        this.valid = valid;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

在这里,我们声明validnamelabel属性。请注意,字段名称不用于确定属性的名称。而是使用get/isset方法。另请注意,原始boolean属性is用于 getter 前缀。

然后使用内省:

Object unknownType = new JavaBean();
BeanInfo javaBeanInfo = Introspector.getBeanInfo(JavaBean.class);
for (PropertyDescriptor property : javaBeanInfo.getPropertyDescriptors()) {
    System.out.println(property.getName());
}

这将打印(不一定按顺序):

class
valid
name
label

class之所以在这里,是因为getClass()所有类都存在该方法,因此class被视为属性。

然后,您可以使用PropertyDescriptor.readMethodPropertyDescriptor.writeMethod分别获取Method作为 getter 和 setter 的对象,然后使用Method.invoke它们使用通常的反射 API 获取和设置给定对象的属性值。PropertyDescriptor还有一些其他的信息,比如属性类型和属性名称。这是直接使用反射的替代方法。它还允许其他人覆盖BeanInfo返回Introspector的自定义实现。

于 2013-08-14T06:50:31.937 回答