当前位置: 首页 > 知识库问答 >
问题:

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

习斌
2023-03-14

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

我将< code>ChannelResource类的一个实例传递给构造函数

编译器不喜欢<code>字段。在此行中获取(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个答案

艾嘉石
2023-03-14

试试这个

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();
      }
  }
 }}
 类似资料:
  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 问题内容: 在这里打印“ Foo”的方式是什么?在此示例中,打印的是“字符串”。 http://play.golang.org/p/ZnK6PRwEPp 问题答案: 你要。上的方法将返回一个结构,该结构描述该字段,其中包括名称以及其他信息。 无法检索代表特定字段值的字段名,因为这是包含结构的属性。

  • 下面是我的示例类,我希望通过在这行中使用反射来获取y和z字段(Field[]fields=forName.getDeclaredFields();)我得到了空数组。如果y和z不是类结构的一部分,那么它们属于哪一部分

  • 问题内容: 我试图通过反射接收字段值。问题是我不知道字段类型,必须在获取值时确定它。 这段代码会导致以下异常: 无法将java.lang.String字段com .... fieldName设置为java.lang.String 我尝试进行转换,但出现编译错误: 要么 我怎样才能做到这一点? 问题答案: 像之前回答的那样,你应该使用: 有时更喜欢的另一种方法是动态调用getter。示例代码: 还应

  • 基本上,我的要求是通过使用反射来获取超类对象,以便获得字段名及其值。 所以,我有一门课 现在我正在使用 当我尝试使用以下代码访问该字段时,它会给我java.lang.Class类的类型。 它让我异常 有人能帮助我如何将其转换为对象,以便我可以访问文件夹

  • 我正在实现一个自定义约束验证注释来验证。我需要知道的值来满足我的验证逻辑。 有没有一种方法可以使用反射来实现这一点?