【问题标题】:Get instanced object by String通过 String 获取实例化对象
【发布时间】:2011-07-02 20:29:25
【问题描述】:

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

类似的东西:

public String xyz = "aaaa_bbb";

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

谢谢

【问题讨论】:

  • 反射是你可能想要的。但也有可能一个简单的HashMap 可以完成您真正需要的工作。

标签: java string object field


【解决方案1】:

您可能需要重新表述问题。

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

【讨论】:

    【解决方案2】:

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

        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。
    【解决方案3】:

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

    但是,我必须警告您,您最终得到的代码将比您预期的要长得多。确实,您必须进行一些操作:

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

    这些步骤中的每一个都会产生一段相当晦涩的代码,并带有一堆抛出的异常。

    所以,如果你有替代品,那就用吧!

    【讨论】:

      【解决方案4】:

      这是一个例子

      如果是类字段,可以这样通过名字获取。

      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() 中获取当前方法中的变量。

      【讨论】:

      • 你好,我已经像你一样实现了,但这是我的问题:m.invoke(stringInstance, ";");, stringInstance 应该是一个像 m.invoke("stringInstance", "; ")
      • 非常感谢,这就是我要找的东西
      【解决方案5】:

      我在 jPanel 上有自定义组件,我想在不重新绘制它们的情况下使用它们。我知道我是否可以使用列表或地图,但我必须更改地图中的值,然后使用地图中的信息重新绘制 GUI。

      【讨论】:

      • 对我来说这似乎不是一个答案。
      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多