[英]Java - Reflection. Set value for the class object which are dynamically created
[英]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.bar
或foo.baz
字段,或
使用反射。
如果需要動態屬性,請使用Map
對象。 例如HashMap<String, String>
。
關於您的說明性示例,由於以下原因,該方法將無法/無法工作:
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時更好的方法。
缺點是:
PropertyDescriptor
數組。 Apache Commons BeanUtils
或Spring BeanWrapper API
。 有關更多信息,請參見java.beans.Introspector
javadocs。
據我所知,互檢是建立在反射之上的,因此它本身就使用反射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.