簡體   English   中英

是否可以在Java中動態設置對象屬性(無反射)?

[英]Is it possible to set object properties dynamically in Java (without reflection)?

說我有以下課程:

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];
}

有可能出現上述情況嗎?

有可能出現上述情況嗎?

沒有。

使用定義的屬性,唯一的選擇是:

  • 編寫或生成Java代碼(或字節碼)以引用foo.barfoo.baz字段,或

  • 使用反射。

如果需要動態屬性,請使用Map對象。 例如HashMap<String, String>


關於您的說明性示例,由於以下原因,該方法將無法/無法工作:

  • 常規對象字段無法像數組一樣被索引,並且
  • 與C ++,Python和其他語言不同,Java不支持任何核心語言結構(方法之外)的臨時重載。

Java不是支持這種事情的動態語言。 您需要學習與它可以為您提供的東西一起生活...或使用其他語言。


您這樣評論:

反射對性能不利。

是的,但這是相對的。 以反射方式訪問或更新字段的速度可能比使用普通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");
       }
   }
}

就其價值而言,該代碼將與使用支持動態屬性的語言設置動態屬性一樣省時。 (我懷疑它會有效利用空間,因為動態屬性是使用天然編碼哈希表典型地實施)。

您可以使用Introspection ,這是面對Java Bean時更好的方法。

缺點是:

  • 如果存在getter / setter,它將調用getter / setter,或者如果沒有getter / setter並且字段是公共的,它將直接訪問字段。
  • 您可以遍歷屬性,因為它為您提供了一個PropertyDescriptor數組。
  • 它支持BeanInfo類,
    • 這樣您就可以配置bean屬性
    • 定義具有不同命名約定的訪問器/更改器(而不是getter或setter)
  • 您可以使用諸如Apache Commons BeanUtilsSpring BeanWrapper API

有關更多信息,請參見java.beans.Introspector javadocs。

據我所知,互檢是建立在反射之上的,因此它本身就使用反射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM