首页 > 解决方案 > 如何使用 Fields 设置值动态调用 setter 方法?

问题描述

在我的代码中,我有一些类需要传递(使用 UDP 发送)到某个服务器,他收到的元素结构包含 Unsigned32 类型值。

我使用 javolution 来定义元素 struct =>

import javolution.io.Struct;

public class ElementData
{
    public Struct.Unsigned32 data1;
    public Struct.Unsigned32 data2;
    public Struct.Unsigned32 data3;
    public Struct.Unsigned32 data4;
    public Struct.Unsigned32 data5;
    public Struct.Unsigned32 data6;
    public Struct.Unsigned32 data7;
    public Struct.Unsigned32 data8;
}

我编写了从 CVS 文件中读取元素结构值数据的代码 - 并将元素结构发送到服务器。我想使用'Field'反射设置元素的值 - 但我不能这样做,因为我不能直接设置值 - 所以我必须调用 unsigned32 的'set'方法来做

例子:

 public static void main(String[] args) throws NoSuchFieldException {
    ElementData element = new ElementData();

    Field[] allFields = ElementData.class.getDeclaredFields();

    Unsigned32 tmp = new Unsigned32();
    tmp.set(12);


    Field f1 = ElementData.class.getDeclaredField(allFields[0].getName());

    f1.setInt(element, 12);         // error because 12 is Int and not Unsigned32
    f1.set(element, 12);              // error also
    f1.set(element, tmp);              // error also

}

我正在寻找任何可能的方式来使用字段调用设置器

标签: javajavolution

解决方案


public static void main(String[] args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { //add these throws

ElementData element = new ElementData();

Field[] allFields = ElementData.class.getFields(); //Change to getFields

Field f1 = ElementData.class.getField(allFields[0].getName()); //Change to getField

Unsigned32 tmp = new Unsigned32(); 

tmp.set(12);

f1.set(element, tmp); //let just f1.set

}  

让我们知道它是否有效。


推荐阅读