java 反射应用
场景需求
最近的一次解析数据包中,因为协议有改变,本来的定长的包,现在变为不定长的。举个例子,本来协议中规定,一个包中,有8个标签,但是每次上来的,不一定都有8个,没有的话,硬件过来的都是0。同时里面也有个字段,说明上来的标签的个数。
所以我这里建立一个相对应的类,里面有8个标签字段对应每个标签。所以在解析的时候,要根据上来的标签个数,动态的为每个标签赋值。
当读取的时候,也是只读取特定个数的字段。
所以,使用反射处理。
动态地赋值(针对属性)
实例如下,根据个数为相应的字段赋值。
先声明需要的字段:
private int tagNum; private long tag0Addr; private int tag0Voltage; private long tag1Addr; private int tag1Voltage; private long tag2Addr; private int tag2Voltage; private long tag3Addr; private int tag3Voltage; private long tag4Addr; private int tag4Voltage; private long tag5Addr; private int tag5Voltage; private long tag6Addr; private int tag6Voltage; private long tag7Addr; private int tag7Voltage;然后开始动态赋值:
for (int i =0;i<tagNum;i++){ Field fieldAddr = this.getClass().getDeclaredField("tag"+i+"Addr"); fieldAddr.setLong(this,NocHelper.asUnsignedInt(data.getInt())); Field fieldVol = this.getClass().getDeclaredField("tag"+i+"Voltage"); fieldVol.setInt(this,NocHelper.asUnsignedByte(data.get())); }因为是私有的属性,必须要getDeclaredField,不然找不到字段。
这样就可以为他们赋值了。
取值 (针对方法)
for (int i = 0; i < sensorTag.getTagNum(); i++) { Method method = sensorTag.getClass().getMethod("getTag" + i + "Addr"); String tagAddr = (String) method.invoke(sensorTag); //do something for every tag }这里就是对方法和属性的反射的应用。
除非注明转载,其他文章均为作者原创,可以自由转载,但请注明转载的本文的地址,请尊重作者的劳动成果。

浙公网安备 33010602011771号