2011-02-23 101 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