Java Reflection获取未知类型SubClass的声明字段

时间:2014-03-04 20:42:48

标签: java inheritance reflection

我正在编写一个数据包类,希望能够获取其SubClasses的所有声明字段,将它们添加到列表中,然后通过网络发送它们。

Packet SuperClass:

public class TCPacket {
private PacketType packetType;
private List<Object> packetData = new ArrayList<Object>();

public TCPacket(PacketType type){
    this.packetType = type;
    packetData.add(type.getIdent());
}

public PacketType getType(){
    return packetType;
}

public List<Object> getDataList(){
    return packetData;
}

public ByteArrayOutputStream getDataOS() throws IOException{
    //writes data to stream
}

public void addData(Object object){
    this.packetData.add(object);
}

private void addDeclaredFields(){
    Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields();

    for(Field field : fields)
        this.packetData.add(field);
}
}

其中重要的一点是:

Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields();

我希望,有了这个,我将能够获得SubClass的所有声明字段,无论SubClass类型如何。

显然我可以这样做:

Field[] fields = this.getClass().asSubclass(PacketRequestLogon.class).getDeclaredFields();

但我宁愿不对每种数据包类型进行硬编码。我真正要问的是,this.getClass()将返回SubClass IF包含它的方法:从SuperClass中调用addDeclaredFields(),否则它将返回super。

1 个答案:

答案 0 :(得分:1)

  

我希望,有了这个,我将能够获得SubClass的所有声明字段,无论SubClass类型如何。

来自Class#getDeclaredFields jadavoc(强调我的):

  

返回Field个对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。其中包括publicprotecteddefault(包)访问权限和private字段,但不包括继承字段

所以你可以确定你没有从超级班中获得这些字段。


测试了addDeclaredFields的当前实现:

class ASuperClass {
    protected int fieldInASuperClass;
    public final void addDeclaredFields(){
        Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields();
        for(Field field : fields) {
            //edited this line for test purposes
            System.out.println(field.getName());
        }
    }
}

class ASubClass extends ASuperClass {
    private int fieldInASubClass;
}

class AnotherSubClass extends ASuperClass {
    private int fieldInAnotherSubClass;
    private int justAnotherFieldInAnotherSubClass;
}

public class AMainClass {
    public static void main(String[] args) {
        new ASuperClass().addDeclaredFields();
        System.out.println("--------------------------------------");
        new ASubClass().addDeclaredFields();
        System.out.println("--------------------------------------");
        new AnotherSubClass().addDeclaredFields();
    }
}

打印:

fieldInASuperClass
--------------------------------------
fieldInASubClass
--------------------------------------
fieldInAnotherSubClass
justAnotherFieldInAnotherSubClass

请注意,只打印子类的声明字段,不会打印继承的字段。