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