Java - 反射:仅获取属于当前类的字段

发布于 2025-01-07 03:46:10 字数 525 浏览 1 评论 0原文

如何获取仅与当前类而不是其所有父类关联的字段?

public class BaseClass()
{
     public int x = 0;
}

public class AnotherClass() extends BaseClass
{
     public int y = -1;
     public int z = -2;

     public void doStuff()
     {
          for(Field f : this.getClass().getFields())
          {
              //Save each field to a file
          }
     }
}

我只想得到属于 AnotherClass 的 Y 和 Z。但上面也给了我 X。

这意味着不必键入我想要保存的每个值。它没有以任何典型格式保存。必须这样保存,因此不建议以其他方式保存字段。

过滤掉每个字段的名称将达不到这样做的目的,因为字段名称远远超过 200 个。

How can I get the fields associated only with the current class instead of all of its parent classes as well?

public class BaseClass()
{
     public int x = 0;
}

public class AnotherClass() extends BaseClass
{
     public int y = -1;
     public int z = -2;

     public void doStuff()
     {
          for(Field f : this.getClass().getFields())
          {
              //Save each field to a file
          }
     }
}

I want to get only Y and Z, which belong to AnotherClass. But the above gives me X as well.

This is meant to replace having to type each value that I want to save. It's not being saved in any typical format. It must be saved like this so don't suggest saving the fields in a different way.

Filtering out each field's name would defeat the purpose of this as there are well over 200.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

十六岁半 2025-01-14 03:46:10

您只能使用 getDeclaredFields。 它将排除继承的字段。

You can get only the fields declared in the class with getDeclaredFields. It will exclude inherited fields.

债姬 2025-01-14 03:46:10

您可以根据 FieldgetDeclaredClass() 进行过滤:

public static List<Field> fieldsDeclaredDirectlyIn(Class<?> c) {
    final List<Field> l = new ArrayList<Field>();
    for (Field f : c.getFields())
        if (f.getDeclaringClass().equals(c))
            l.add(f);
    return l;
}

这仅为您的示例选择 yz

You can filter based upon the Field's getDeclaredClass():

public static List<Field> fieldsDeclaredDirectlyIn(Class<?> c) {
    final List<Field> l = new ArrayList<Field>();
    for (Field f : c.getFields())
        if (f.getDeclaringClass().equals(c))
            l.add(f);
    return l;
}

This picks just y and z for your example.

意中人 2025-01-14 03:46:10

可能有一种更干净的方法可以使用某些函数的标志来完成此操作,但一个明显的答案(以及我过去所做的)是找到 this.getClass().getFields()< 之间的区别/code> 和 super.getClass().getFields() 数组。

There may be a cleaner way to do this with flags to some function, but an obvious answer (and what I've done in the past) is to find the difference between the this.getClass().getFields() and the super.getClass().getFields() arrays.

贩梦商人 2025-01-14 03:46:10

使用 public Field[] getDeclaredFields()

返回一个 Field 对象数组,反映由该 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。

      Field[] fields = AnotherClass.class.getDeclaredFields();
      for(Field f : fields){
          System.out.println(f.getName());
      }

Using public Field[] getDeclaredFields()

Returns an array of Field objects reflecting all the fields declared by the class or interface represented by this Class object. This includes public, protected, default (package) access, and private fields, but excludes inherited fields.

      Field[] fields = AnotherClass.class.getDeclaredFields();
      for(Field f : fields){
          System.out.println(f.getName());
      }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文