是否有可能获得在运行系统中通过字符串在代码中实例化的对象?通过字符串获取实例化对象
财产以后这样的:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
感谢
是否有可能获得在运行系统中通过字符串在代码中实例化的对象?通过字符串获取实例化对象
财产以后这样的:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .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()
也许目前的方法来获得变量英寸
你好,我已经像你一样实施,但这是我的问题:米。invoke(stringInstance,“;”); stringInstance应该是一个像m.invoke(“stringInstance”,“;”)的字符串 – user630447 2011-02-23 15:53:38
@ user630477我编辑了一点点。一探究竟。 – 2011-02-23 16:12:40
非常感谢,这就是我一直在寻找的 – user630447 2011-02-23 16:18:18
您可能需要改写的问题。
如果你只是想获得“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
类。
我有jPanel上的自定义组件,我想与他们合作,而不重绘他们。我知道,如果我使用List或Map来实现,但我必须更改Map中的值,然后使用Map中的信息重新绘制GUI。 – user630447 2011-02-23 16:11:21
如果您的字符串是您的对象的成员字段,您可以去看看Field
类。
但是,我必须警告您,您最终得到的代码将比您期望的要长得多。事实上,你就必须做一些操作:
Class#getDeclaredMethod(...)
)这些步骤中的每一个都会带有一段相当晦涩的代码行,并带有一堆被抛出的异常。
所以,如果你有其他选择,那就用它!
我有一个jPanel上的自定义组件,我想与他们合作,而不重绘他们。我知道,如果我使用List或Map来实现,但我必须更改Map中的值,然后使用Map中的信息重新绘制GUI。
似乎并没有给我一个答案。 – TechNyquist 2015-01-30 07:41:33
反射是你可能想要的。但它也可能是一个简单的'HashMap'可以做你真正需要它的东西。 – biziclop 2011-02-23 15:30:37
这是不可能的。 – 2011-02-23 15:31:45