使用反射API获取字段名称和值

时间:2017-05-24 18:00:37

标签: java reflection

我正在创建一些POJO,并且必须为每个POJO创建toString()个方法。我认为使用反射API创建一个为我工作的类更容易 - 在一个地方创建功能并在每个POJO中使用它,而不是手动编码。

POJO中的所有字段都是私有的。 POJO是JSON对象的Java对象表示。

要求是遍历类中的字段,并列出字段和值。

我目前正在测试名为ChannelResource.

的类的功能

这是我用来列出字段名称和值的类:

    import java.lang.reflect.Field;
    public class ToStringMaker {
      public ToStringMaker( Object o) {

      Class<? extends Object> c = o.getClass();
      Field[] fields = c.getDeclaredFields();
      for (Field field : fields) {
          String name = field.getName();            
          try {
            System.out.format("%n%s: %s", name, field.get(o));
          } catch (IllegalArgumentException e) {
            e.printStackTrace();
          } catch (IllegalAccessException e) {
            e.printStackTrace();
          }
      }
  }}

我正在将ChannelResource类的实例传递给构造函数。

编译器不喜欢此行中的field.get(o)

    System.out.format("%n%s: %s", name, field.get(o));

编译器说:

    java.lang.IllegalAccessException: Class ToStringMaker can not access a member of class ChannelResource with modifiers "private"

ToStringMaker如果我让所有成员公开,那就有效,但我真的不愿意这样做。有没有其他方法可以获得私有领域的价值?

我知道Apache组织有一些创建toString功能的东西,但我不喜欢这种格式。

1 个答案:

答案 0 :(得分:2)

试试这个

import java.lang.reflect.Field;
public class ToStringMaker {
  public ToStringMaker( Object o) {

  Class<? extends Object> c = o.getClass();
  Field[] fields = c.getDeclaredFields();
  for (Field field : fields) {
      String name = field.getName();  
    field.setAccessible(true);          
      try {
        System.out.format("%n%s: %s", name, field.get(o));
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
  }
 }}