Java反射获取未知类型子类的声明字段

Java反射获取未知类型子类的声明字段,java,inheritance,reflection,Java,Inheritance,Reflection,我正在编写一个数据包类,希望它能够获取其子类的所有声明字段,将它们添加到列表中,然后通过网络发送它们 数据包超类: public class TCPacket { private PacketType packetType; private List<Object> packetData = new ArrayList<Object>(); public TCPacket(PacketType type){ this.packetType = type;

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

数据包超类:

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(PacketRequestLogon.class).getDeclaredFields();
但我不希望对每种数据包类型都进行硬编码。我真正想问的是,如果包含它的方法addDeclaredFields()是从超类中调用的,那么这个.getClass()会返回子类吗?还是会返回超类

我的希望是,有了它,我将能够只获取子类的所有声明字段,而不管子类的类型如何

来自jadavoc(重点矿山):

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

因此,您可以确定您没有从超类获取字段


测试了
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

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

。我忘记添加,我会测试它,但我的类远未完成,因此我无法在其当前状态下运行它。感谢您的澄清,这是:this.getClass().asSubclass(this.getClass())如果在子类实例中调用,则返回子类?@LexWebb answer edited,为您的方法添加了一个测试。我现在无法从该字段中获取数据。我一直在获取java.lang.IllegalArgumentException:无法设置int.当尝试执行field.get()时;有什么想法吗?@LexWebb这是另一个问题,应该在另一篇文章中提供相关代码。但是,当您调用
字段#get
时,您应该传递对象引用,从中检索数据。
fieldInASuperClass
--------------------------------------
fieldInASubClass
--------------------------------------
fieldInAnotherSubClass
justAnotherFieldInAnotherSubClass