2

我可以Class通过名称访问属性吗?

例如:

class Test {
    Integer GoodVar;
    Integer BadVar;
    ...

    void Func(String name, Integer value) {
        // Set A Value based on its name
    }

    void Init() {
        Func("GoodVar", 2);
        Func("BadVar", 1);
    }
}

有人可以编码Func功能吗?

4

4 回答 4

3

您可以使用 switch 语句,在 JDK 7 中允许使用字符串(请参阅:http ://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html )。就像是:

switch (name) {
     case "GoodVar":
         GoodVar = value;
         break;
     case "BadVar":
         BadVar = value;
         break;
     default:
         throw new IllegalArgumentException("Invalid name: " + name);
 }

在 JDK 7 之前,您可以改用 if 语句。另一种方法是使用反射(参见:http ://docs.oracle.com/javase/tutorial/reflect/index.html ),但速度很慢,例如:

Field f = getClass().getField(name);
if (f!=null){
 f.setAccessible(true);
 f.setInt(this, value);
}else
  throw new IllegalArgumentException("Invalid name: " + name);  
于 2012-10-15T11:23:20.117 回答
1

您正在寻找的东西称为反射。您可以执行以下操作:

void Func(String name, Integer value) {
    Field f = getClass().getField(name);
    f.setAccessible(true); // needed because f is not public
    f.setInt(this, value)
}

但是我可以添加一些评论吗?

  1. 按照惯例,字段、变量和方法必须以小写字母开头。
  2. 字段必须是私有的。当它们可以被保护或包保护时,有几个特殊情况。这不是你的情况。
于 2012-10-15T11:28:02.187 回答
0

试试这个:

void Func(String name, Integer value) {
    // Set A Value based on its name
    Field f = getClass().getDeclaredField(name);
    f.setAccessible(true);
    f.set(this, value);
}
于 2012-10-15T11:27:22.757 回答
0

也试试这个:

package SO;

import java.lang.reflect.Field;

class Test {
    Integer GoodVar;
    Integer BadVar;

    void Func(String name, Integer value) throws IllegalArgumentException, IllegalAccessException {
    Field[] fields = this.getClass().getDeclaredFields();
    for (Field field : fields) {
        field.setAccessible(true);
        if (name.equals(field.getName())) {
        field.set(this, value);
        }
    }
    }
   // or a optimul way:
 void Func1(String name, Integer value) throws IllegalArgumentException, IllegalAccessException, SecurityException,
        NoSuchFieldException {
    Field field = this.getClass().getDeclaredField(name);
    field.setAccessible(true);
    field.set(this, value);
    }
    void Init() throws IllegalArgumentException, IllegalAccessException {
    Func("GoodVar", 2);
    Func("BadVar", 1);
    }

    @Override
    public String toString() {
    return "[GoodVar->" + GoodVar + ",BadVar-> " + BadVar + "]";
    }
}

使用示例 Main 方法:

package SO;

public class TestTest {
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
    Test test = new Test();
    System.out.println(test);
    test.Func("GoodVar", 1);
    test.Func("BadVar", 2);
    System.out.println(test);
    }
}

它打印:

[GoodVar->null,BadVar-> null]
[GoodVar->1,BadVar-> 2]
于 2012-10-15T11:37:30.453 回答