【问题标题】:Use reflection API to get field names and values使用反射 API 获取字段名称和值
【发布时间】:2017-05-25 11:34:41
【问题描述】:

我正在创建许多 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 功能,但我不喜欢这种格式。

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    试试这个

    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();
          }
      }
     }}
    

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多