按String获取实例化对象

是否有可能在运行时通过字符串获取在代码中实例化的Object?

这样的事情:

public String xyz = "aaaa_bbb"; getObject("xyz").some function of String (eg: .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()中获取当前方法中的变量。

您可能需要重新解释这个问题。

如果你只想从初始字符串中获取“aaaa”和“bbb”字符串,可以使用StringTokenizer

很难弄清楚你在问什么,但你可以使用reflection按名称获取字段值。 像这样的东西:

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

(我遗漏了很多exception处理……)

但正如评论所指出的那样,如果你真的想要实现一个关联数组,那么在Java中有更好的方法可以做到这一点。 例如,使用Map类。

如果String是对象的成员字段,则可以查看Field类。

但是,我必须警告您,您最终得到的代码将远远超出您的预期。 实际上,你必须做一些操作:

  1. 获取与xyz关联的Field obejct
  2. 从名称和参数列表中获取方法(使用示例Class#getDeclaredMethod(...)
  3. 在此特定实例上调用方法

这些步骤中的每一步都会有一个相当模糊的代码行,带有一堆抛出的exception。

所以,如果你有另一种选择,那么,使用它!

我在jPanel上有自定义组件,我想与它们一起工作而不重新绘制它们。 我知道如果我使用List或Map,但我必须更改Map中的值,然后使用Map中的infomration重新绘制GUI。