java 反射應用

來源:互聯網
上載者:User

標籤:

情境需求
最近的一次解析資料包中,因為協議有改變,本來的定長的包,現在變為不定長的。舉個例子,本來協議中規定,一個包中,有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 反射應用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.