是否可以在运行时通过字符串获取在代码中实例化的Object?
这样的事情:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
由于
答案 0 :(得分:6)
这是一个例子
如果它是一个类字段,你可以按照这个名字来获取它。
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()
中获取当前方法中的变量。
答案 1 :(得分:0)
你可能需要重新解释这个问题。
如果您只想从初始字符串中获取“aaaa”和“bbb”字符串,可以使用StringTokenizer
答案 2 :(得分:0)
很难弄清楚你在问什么,但你可以使用反射按名称获取字段值。像这样:
Class c = this.getClass(); // or Someclass.class
Field f = c.getDeclaredField("xyz");
String value = (String) f.get(this);
... = value.split("_");
(我遗漏了很多异常处理......)
但正如评论指出的那样,如果你真的想要实现一个关联数组,那么有更好的方法可以在Java中实现这一点;例如使用Map
类。
答案 3 :(得分:0)
如果您的String是对象的成员字段,您可以查看Field
类。
但是,我必须警告你,你最终得到的代码将远远超出你的预期。实际上,你必须做一些操作:
Class#getDeclaredMethod(...)
)这些步骤中的每一步都会引发一系列相当模糊的代码,并带有一堆抛出的异常。
所以,如果你有另一种选择,那么,使用它!
答案 4 :(得分:-1)
我在jPanel上有自定义组件,我想在不重新绘制它们的情况下使用它们。我知道如果我使用List或Map,但我必须更改Map中的值,然后使用Map中的infomration重新绘制GUI。