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

Java 使用反射API获取字段名和值,java,reflection,Java,Reflection,我正在创建许多POJO,并且必须为每个POJO创建toString()方法。我认为创建一个类来使用反射API为我完成工作会更容易,而不是手工编写每个类——在一个地方创建功能,并在每个POJO中使用它 POJO中的所有字段都是私有的。POJO是JSON对象的Java对象表示 要求遍历类中的字段,并列出字段和值 我目前正在一个名为ChannelResource的类上测试该功能。 下面是我用来列出字段名和值的类: import java.lang.reflect.Field; publ

我正在创建许多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();
          }
      }
  }}
编者说:

    java.lang.IllegalAccessException: Class ToStringMaker can not access a member of class ChannelResource with modifiers "private"
ToStringMaker
如果我将所有成员公开,它就可以工作,但我真的不想这样做。有没有其他方法可以获取私有字段的值

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

试试这个

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();
      }
  }
 }}
import java.lang.reflect.Field;
公共类ToStringMaker{
公共ToString Maker(对象o){
Class试试这个

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();
      }
  }
 }}
import java.lang.reflect.Field;
公共类ToStringMaker{
公共ToString Maker(对象o){
等级