2011-02-23 66 views
3

是否有可能獲得在運行系統中通過字符串在代碼中實例化的對象?通過字符串獲取實例化對象

財產以後這樣的:

public String xyz = "aaaa_bbb"; 

getObject("xyz").some function of String (e.g.: .split("_")) 

感謝

+3

反射是你可能想要的。但它也可能是一個簡單的'HashMap'可以做你真正需要它的東西。 – biziclop 2011-02-23 15:30:37

+0

這是不可能的。 – 2011-02-23 15:31:45

回答

5

下面是一個例子

如果它是一個類的字段,你可以通過這樣的名字得到它。

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()也許目前的方法來獲得變量英寸

+0

你好,我已經像你一樣實施,但這是我的問題:米。invoke(stringInstance,「;」); stringInstance應該是一個像m.invoke(「stringInstance」,「;」)的字符串 – user630447 2011-02-23 15:53:38

+0

@ user630477我編輯了一點點。一探究竟。 – 2011-02-23 16:12:40

+0

非常感謝,這就是我一直在尋找的 – user630447 2011-02-23 16:18:18

0

您可能需要改寫的問題。

如果你只是想獲得「AAAA」,並從初始字符串「BBB」的字符串,你可以使用StringTokenizer

0

這是很難做出來你問什麼,但你可以通過獲取字段值名稱使用反射。事情是這樣的:

Class c = this.getClass(); // or Someclass.class 
    Field f = c.getDeclaredField("xyz"); 
    String value = (String) f.get(this); 
    ... = value.split("_"); 

(我省略了很多的異常處理...)

但作爲一個評論所指出的,如果你真的想實現一個關聯數組,有在Java中執行此操作的更好方法;例如使用Map類。

+0

我有jPanel上的自定義組件,我想與他們合作,而不重繪他們。我知道,如果我使用List或Map來實現,但我必須更改Map中的值,然後使用Map中的信息重新繪製GUI。 – user630447 2011-02-23 16:11:21

0

如果您的字符串是您的對象的成員字段,您可以去看看Field類。

但是,我必須警告您,您最終得到的代碼將比您期望的要長得多。事實上,你就必須做一些操作:

  1. 獲取有關從它的名稱和參數列表XYZ
  2. Get方法現場obejct(使用作爲一個例子Class#getDeclaredMethod(...)
  3. 調用這個方法特定實例

這些步驟中的每一個都會帶有一段相當晦澀的代碼行,並帶有一堆被拋出的異常。

所以,如果你有其他選擇,那就用它!

-1

我有一個jPanel上的自定義組件,我想與他們合作,而不重繪他們。我知道,如果我使用List或Map來實現,但我必須更改Map中的值,然後使用Map中的信息重新繪製GUI。

+0

似乎並沒有給我一個答案。 – TechNyquist 2015-01-30 07:41:33

相關問題