Java反射:仅获取属于当前类的字段
如何获取仅与当前类而不是其所有父类关联的字段Java反射:仅获取属于当前类的字段,java,class,reflection,field,Java,Class,Reflection,Field,如何获取仅与当前类而不是其所有父类关联的字段 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().get
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
}
}
}
我只想得到Y和Z,它们属于另一个类。但是上面也给了我X
这意味着替换必须键入我要保存的每个值。它没有以任何典型的格式保存。它必须这样保存,所以不要建议以其他方式保存字段
过滤掉每个字段的名称将无法达到此目的,因为有200多个字段。可能有一种更干净的方法可以通过一些函数的标志来实现这一点,但一个显而易见的答案(以及我过去所做的)是找到
this.getClass().getFields()和super.getClass().getFields()之间的区别
数组。您可以根据字段的getDeclaredClass()
进行筛选:
公共静态列表字段直接声明在(c类){
最终列表l=新的ArrayList();
对于(字段f:c.getFields())
如果(f.getDeclaringClass()等于(c))
l、 添加(f);
返回l;
}
这只选择了y
和z
作为示例。您只能获取类中声明的字段,它将排除继承的字段。使用公共字段[]getDeclaredFields()
返回字段对象数组,该数组反映由该类对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段
Field[] fields = AnotherClass.class.getDeclaredFields();
for(Field f : fields){
System.out.println(f.getName());
}
蒂希。我在提供的代码示例上测试了getDeclaredFields()
,发现它返回了三个元素,因此以不正确为由拒绝了它。(是的,这比阅读文档容易。)然而,我将示例代码粘贴为一个内部类,第三个字段不是BaseClass.x,而是超类。这是$0引用。阅读?呸!
Field[] fields = AnotherClass.class.getDeclaredFields();
for(Field f : fields){
System.out.println(f.getName());
}