zoukankan      html  css  js  c++  java
  • 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
    }

    这里就是对方法和属性的反射的应用。

  • 相关阅读:
    写点别的,关于二维码,由印美图想到的
    600篇以上博客,才能进阶到精通的地步,奋斗吧少年
    写博客真的很枯燥,更麻烦的是我还不会MD,排版太不友好了啊。
    对sqlserver存储过程合游标的一些理解
    sqlserver的存储过程
    Apache负载均衡配置
    组合模式解决原型创建对象传参和共享难题
    原型创建对象
    构造函数创建对象
    jQuery实现瀑布流的简单方法
  • 原文地址:https://www.cnblogs.com/juepei/p/4468713.html
Copyright © 2011-2022 走看看