通过String获取实例化对象

时间:2011-02-23 15:27:02

标签: java string object field

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

这样的事情:

public String xyz = "aaaa_bbb";

getObject("xyz").some function of String (e.g.: .split("_"))

由于

5 个答案:

答案 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类。

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

  1. 获取与xyz相关的Field obejct
  2. 从名称和参数列表中获取方法(使用示例Class#getDeclaredMethod(...)
  3. 在此特定实例上调用方法
  4. 这些步骤中的每一步都会引发一系列相当模糊的代码,并带有一堆抛出的异常。

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

答案 4 :(得分:-1)

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