【发布时间】:2011-07-02 20:29:25
【问题描述】:
是否可以在运行时通过字符串获取代码中实例化的对象?
类似的东西:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
谢谢
【问题讨论】:
-
反射是你可能想要的。但也有可能一个简单的
HashMap可以完成您真正需要的工作。
是否可以在运行时通过字符串获取代码中实例化的对象?
类似的东西:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
谢谢
【问题讨论】:
HashMap 可以完成您真正需要的工作。
您可能需要重新表述问题。
如果只想从初始字符串中获取“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 类。
【讨论】:
如果你的String是你对象的成员字段,你可以去看看Field类。
但是,我必须警告您,您最终得到的代码将比您预期的要长得多。确实,您必须进行一些操作:
Class#getDeclaredMethod(...)为例)这些步骤中的每一个都会产生一段相当晦涩的代码,并带有一堆抛出的异常。
所以,如果你有替代品,那就用吧!
【讨论】:
这是一个例子
如果是类字段,可以这样通过名字获取。
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() 中获取当前方法中的变量。
【讨论】:
我在 jPanel 上有自定义组件,我想在不重新绘制它们的情况下使用它们。我知道我是否可以使用列表或地图,但我必须更改地图中的值,然后使用地图中的信息重新绘制 GUI。
【讨论】: