【问题标题】:Java - Exclude superclass fields from reflectionJava - 从反射中排除超类字段
【发布时间】:2012-11-19 23:30:49
【问题描述】:
我正在使用此代码来获取与对象关联的所有字段。有问题的 Object 具有三个超类,其他类从该对象扩展而来。
for (Field f : this.getClass().getFields()){
try{
fieldName = f.getName();
fieldType = f.getType().toString();
//Do more stuf
}
我不想获取与超类关联的字段,但我想要当前类中的所有字段以及所有可能从它扩展的字段。
如何筛选出我需要的字段?
【问题讨论】:
标签:
java
class
reflection
field
superclass
【解决方案1】:
我不想获取与超类关联的字段,但我想要当前类中的所有字段以及所有可能从它扩展的字段。
您无法获得“所有可能从它扩展的内容” - 但如果您使用 Class.getDeclaredFields() 而不是 getFields(),那么您将只能获得该类中声明的字段。
【解决方案2】:
对于每个Field,您可以使用getDeclaringClass() 来确定声明该字段的类,所以如果您有类似的层次结构
A
|
B
|
C
|\
D E
并且您只想要在C、D 或E 中声明的字段,那么您可以说
for (Field f : this.getClass().getFields()){
if(C.class.isAssignableFrom(f.getDeclaringClass())) {
// f was declared by C or one of its subclasses
如果this 是C 的实例,您将只获得C 的公共字段,如果this 是D,您将获得C 和@987654334 的公共字段@,如果this 是A 或B,则根本不会得到任何字段。