有没有一种方法可以输出对象中的所有变量名?

时间:2019-08-20 03:57:27

标签: java

我想在一个对象中输出所有变量名,例如“ id,名字,姓氏”。我不想要变量的值,我只想要变量名。有访问变量名的方法吗?

我尝试使用反射和场。当我尝试使用它时,它会打印出该类中的所有变量。而不是打印出对象中的所有属性名称。

public void printFieldNames()
{
    Field[] fields = ClassName.class.getDeclaredFields();
    //gives no of fields
    System.out.println(fields.length);         
    for (Field field : fields) 
    {
    //gives the names of the fields
    System.out.println(field.getName());  
    }
}

我想要对象中所有属性名称的输出,但是我只能获得的输出是类变量。

2 个答案:

答案 0 :(得分:1)

我认为这里混合了一些概念(除非我自己想念这个问题的目的)。

Java是一种语言,当您在“代码时间”内“描述”运行时将创建的对象时,必须声明所有数据字段,以便编译器具有此信息。

创建类正是这样做的方法。

java中没有“ expando”的概念,也没有动态属性定义。一切都很严格,一切都是静态类型。

所以说你上课了

  public class MyClass {
     private Integer foo;
     private String bar; 
     // constructor, methods, etc.
  }

这意味着该类的所有实例将具有这两个字段。您可以将字段设置为静态,以便在实例之间共享,可以更改其可见性以进行封装,但仅此而已。

无法执行以下操作(与某些其他语言不同):

  MyClass myClass = new MyClass();
  myClass.aNewField = 42;

这样的代码甚至无法编译

这为您提供了您已经尝试过的基于反射的方法,并且我相信在该课程中您可以看到打印的“ foo”和“ bar”。 您可以通过反射查询该类的所有结构(它具有哪些方法,哪些数据字段,它们的名称,其类型,访问修饰符,元数据(注释)等)。

鉴于此信息,也许您想提供一个更好的示例,说明要使用真实的类定义和预期的/实际的输出要实现的目标。

答案 1 :(得分:0)

Mark Bramnik很好地解释了以上答案,即为什么我们不能在Java对象中存储变量名。由于编译器不允许使用已经在相同作用域中声明的相同名称创建变量,因此变量名称在作用域中是唯一的。因此,您可以在Set<String>中收集变量名。

Set<String> fieldNames = Arrays.stream(ClassName.class.getDeclaredFields())
                .map(Field::getName)
                .collect(Collectors.toSet());

fieldNames.forEach(System.out::println);