Java - 从反射中排除超类字段

时间:2012-11-19 23:30:50

标签: java class reflection field superclass

我正在使用此代码获取与Object关联的所有字段。有问题的对象有三个超类,其他类从这个对象扩展。

for (Field f : this.getClass().getFields()){
    try{
        fieldName = f.getName();
        fieldType = f.getType().toString();
        //Do more stuf
    }

我不想获得与超类相关联的字段,但我希望当前类中的所有字段以及可能从中扩展的所有字段。

如何过滤掉我需要的字段?

2 个答案:

答案 0 :(得分:5)

  

我不想获得与超类相关联的字段,但我希望当前类中的所有字段以及可能从其扩展的所有字段。

你不能得到“所有那些可能延伸的东西” - 但是如果你使用Class.getDeclaredFields()而不是getFields()那么你只会获得在该类中声明的字段。

答案 1 :(得分:3)

对于每个Field,您可以使用getDeclaringClass()来确定声明该字段的类,因此如果您具有类似

的层次结构
A
|
B
|
C
|\
D E

并且您只想要在CDE中声明的字段,然后您可以说

for (Field f : this.getClass().getFields()){
  if(C.class.isAssignableFrom(f.getDeclaringClass())) {
    // f was declared by C or one of its subclasses

如果thisC的实例,则您只会获得C的公开字段,如果thisD,您将获得C Dthis的公共字段,如果AB或{{1}},则根本不会显示任何字段。