假设我有以下类(class):
class Foo
{
public String bar;
public String baz;
}
我在另一个类中有以下代码:
Foo foo = new Foo();
String[] properties = {"bar", "baz"};
String[] values = {"barValue", "bazValue"};
是否可以遍历 properties
数组并使用它来设置 Foo
的值?例如:
for (int i = 0; i < properties.length; i++)
{
foo[ properties[i] ] = values[i];
}
像上面这样的事情可能吗?
最佳答案
Is something like the above possible?
没有。
使用您定义的属性,您唯一的选择是:
编写或生成 Java 代码(或字节码)以引用字段 a
foo.bar
或foo.baz
,或者使用反射。
如果你想要动态属性,使用 Map
目的;例如一个HashMap<String, String>
.
至于你的说明性例子,那不会/不能工作,因为:
- 不能像数组一样对常规对象字段进行索引,并且
- 与 C++、Python 和其他语言不同,Java 不支持任何核心语言结构(方法除外)的临时重载。
Java 不是支持这种东西的动态语言。您需要学会接受它可以为您提供的一切……或者使用不同的语言。
你这样评论:
Reflection is supposed to be bad for performance.
是的,但这是相对的。以反射方式访问或更新字段可能比使用普通 Java 代码访问/更新字段慢 10 到 100 倍。但是,如果您只是偶尔这样做,性能开销可能无关紧要。如果它确实是一个问题,那么您的选择包括手写或生成代码。例如:
public class Foo
{
public String bar;
public String baz;
public void setNamedProperty(String name, String value) {
switch (name) {
case "bar":
bar = value;
break;
case "baz":
baz = value;
break;
default:
throw new IllegalArgumentException("Unknown property name");
}
}
}
就其值(value)而言,该代码将与使用支持动态属性的语言设置动态属性一样省时。 (而且我怀疑它会节省空间,因为动态属性通常是使用 native 编码哈希表实现的。)
关于java - 是否可以在 Java 中动态设置对象属性(无需反射)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341832/