在 Java 中按名称设置变量

2022-09-02 23:19:37

我希望在Java中实现一些东西,大致如下:

class Foo{
 private int lorem; //
 private int ipsum;      

 public setAttribute(String attr, int val){
  //sets attribute based on name
 }

 public static void main(String [] args){
  Foo f = new Foo();
  f.setAttribute("lorem",1);
  f.setAttribute("ipsum",2);
 }

 public Foo(){}
}

...其中,变量是根据变量名称设置的,没有对变量名称进行硬编码,也不使用任何其他数据结构。这可能吗?


答案 1

以下是使用反射实现的方法(我已重命名该函数;不同的字段类型有不同的反射函数):setAttribute

public void setIntField(String fieldName, int value)
        throws NoSuchFieldException, IllegalAccessException {
    Field field = getClass().getDeclaredField(fieldName);
    field.setInt(this, value);
}

答案 2

通常,您希望使用反射。以下是该主题的良好介绍,并附有示例

特别是,“更改字段的值”部分介绍了如何执行所需的操作。

我注意到作者说,“这个功能非常强大,在其他传统语言中没有等效的功能。当然,在过去的十年中(这篇文章写于1998年),我们看到了动态语言的巨大进步。以上在Perl,Python,PHP,Ruby等中很容易完成。我怀疑这是你根据“eval”标签可能来自的方向。