java - 是否可以在 Java 中动态设置对象属性(无需反射)?

标签 java

假设我有以下类(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.barfoo.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/

相关文章:

java - JDBC 模拟 KeyHolder

java - 如何实现 mongoTemplate.findDistinct()?

java - 调用 EntityManager.find() 后 MySQL 中的待处理进程

java - 返回可观察列表中第一个发出的结果,如果为空则返回错误

Java-菜单在用户选择后不启动选项循环(无编译错误)

java - 在 Spring MVC 应用程序中使用 facebook 登录?

java - 从 YAML 文件自动配置 log4j 2 时出现问题

java - 如何让滚动条从底部开始?

java - SHA-256 自定义长度摘要

java - 如何处理悬停在不同元素上并仅通过 css 更改不同元素的图像