標籤:
情境需求
最近的一次解析資料包中,因為協議有改變,本來的定長的包,現在變為不定長的。舉個例子,本來協議中規定,一個包中,有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
}
這裡就是對方法和屬性的反射的應用。
java 反射應用