我正在编写一个数据包类,希望能够获取其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。
答案 0 :(得分:1)
我希望,有了这个,我将能够获得SubClass的所有声明字段,无论SubClass类型如何。
来自Class#getDeclaredFields
jadavoc(强调我的):
返回
Field
个对象的数组,这些对象反映由此Class
对象表示的类或接口声明的所有字段。其中包括public
,protected
,default
(包)访问权限和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
请注意,只打印子类的声明字段,不会打印继承的字段。