是否有可能獲得在運行系統中通過字符串在代碼中實例化的對象?通過字符串獲取實例化對象
財產以後這樣的:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
感謝
是否有可能獲得在運行系統中通過字符串在代碼中實例化的對象?通過字符串獲取實例化對象
財產以後這樣的:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
感謝
下面是一個例子
如果它是一個類的字段,你可以通過這樣的名字得到它。
import java.lang.reflect.Method;
public class Test {
public String stringInstance = "first;second";
public void Foo() {
try {
Object instance = getClass().getDeclaredField("stringInstance").get(this);
Method m = instance.getClass().getMethod("split", String.class);
Object returnValue = m.invoke(instance, ";");
if(returnValue instanceof String[])
{
for(String s : (String[])returnValue)
{
System.out.println(s);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String a[]){
new Test().Foo();
}
}
如果這是您要調用的本地方法變量,那麼你可能能夠在從調用堆棧Thread.currentThread().getStackTrace()
也許目前的方法來獲得變量英寸
你好,我已經像你一樣實施,但這是我的問題:米。invoke(stringInstance,「;」); stringInstance應該是一個像m.invoke(「stringInstance」,「;」)的字符串 – user630447 2011-02-23 15:53:38
@ user630477我編輯了一點點。一探究竟。 – 2011-02-23 16:12:40
非常感謝,這就是我一直在尋找的 – user630447 2011-02-23 16:18:18
您可能需要改寫的問題。
如果你只是想獲得「AAAA」,並從初始字符串「BBB」的字符串,你可以使用StringTokenizer
這是很難做出來你問什麼,但你可以通過獲取字段值名稱使用反射。事情是這樣的:
Class c = this.getClass(); // or Someclass.class
Field f = c.getDeclaredField("xyz");
String value = (String) f.get(this);
... = value.split("_");
(我省略了很多的異常處理...)
但作爲一個評論所指出的,如果你真的想實現一個關聯數組,有在Java中執行此操作的更好方法;例如使用Map
類。
我有jPanel上的自定義組件,我想與他們合作,而不重繪他們。我知道,如果我使用List或Map來實現,但我必須更改Map中的值,然後使用Map中的信息重新繪製GUI。 – user630447 2011-02-23 16:11:21
如果您的字符串是您的對象的成員字段,您可以去看看Field
類。
但是,我必須警告您,您最終得到的代碼將比您期望的要長得多。事實上,你就必須做一些操作:
Class#getDeclaredMethod(...)
)這些步驟中的每一個都會帶有一段相當晦澀的代碼行,並帶有一堆被拋出的異常。
所以,如果你有其他選擇,那就用它!
我有一個jPanel上的自定義組件,我想與他們合作,而不重繪他們。我知道,如果我使用List或Map來實現,但我必須更改Map中的值,然後使用Map中的信息重新繪製GUI。
似乎並沒有給我一個答案。 – TechNyquist 2015-01-30 07:41:33
反射是你可能想要的。但它也可能是一個簡單的'HashMap'可以做你真正需要它的東西。 – biziclop 2011-02-23 15:30:37
這是不可能的。 – 2011-02-23 15:31:45