【问题标题】:Set Object name from String从字符串设置对象名称
【发布时间】:2014-03-10 04:43:34
【问题描述】:

我必须使用反射创建对象,但我遇到了如何设置字符串中指定的实例名称的问题,例如字符串包含:

new instancename java.util.Arraylist

其中 instancename 指的是 Arraylist 的新实例,我知道如何通过反射创建对象,但我无法找到一种方法来从字符串中为实例分配特定名称。有什么帮助吗?提前致谢。

【问题讨论】:

  • 那么,您想将创建的实例分配给给定的变量名吗?如果是这样,请尝试使用 java.lang.reflect.Field 和/或 java.lang.reflect.Method
  • @OscarRyz 我希望能够从 instancename 调用 Arraylist 的函数。例如instancename.add 等。我该怎么办?
  • 你能用伪 Java 代码说明你想做什么吗?
  • 哦,所以你想调用创建实例的方法..我会发布一个例子

标签: java string reflection instantiation


【解决方案1】:

引用创建的对象的变量名不定义对象,运行时不能赋值。因此,要创建一个“名称”来引用一个对象,并且您可以稍后通过您的“脚本”(您提到的字符串)使用该对象,您需要自己实现它。

一种方法是使用 Map,每次创建新对象时(在处理示例中的字符串时),您都可以在其中添加名称并将(地图的)值指向对象)。这种方法的问题在于,如果您从不删除此 Map 条目,则垃圾收集器将永远不会从内存中释放此对象。为了解决这个问题,你应该在你的“脚本”中有一些方法来告诉什么时候释放一个创建的对象。

【讨论】:

    【解决方案2】:

    Java 在想要打印类实例名称时调用该类的 toString 方法。 如果您的类中未实现 toString,则调用 Object 的默认 toString 方法。 Apache Commons Lang 有一个名为 ReflectionToStringBuilder 的功能。你可能想看看。

    【讨论】:

      【解决方案3】:

      用来保存引用的变量名是:

      • 不相关
      • 仅在编译时可用

      关心变量名是什么是没有意义的,即使你可以在运行时定义一个变量,你也不能对它做任何事情,而你不能。

      接近你想要的是使用地图:

      Map<String, Object> objects = new HashMap<>();
      // extract className and name from input
      Object object = Class.forName(className);
      objects.put(name, object);
      

      然后将地图的引用传回您需要创建对象的位置。

      【讨论】:

        【解决方案4】:

        下面的程序创建一个你指定的类的实例,然后调用任何带有一个object类型参数的方法;

        import java.lang.reflect.*;
        
        
        class InvokeMethod {
            public static void main( String ... args ) throws 
                ClassNotFoundException,
                NoSuchMethodException,
                IllegalAccessException,
                InvocationTargetException, 
                InstantiationException {
        
                String clazz  = args[0]; // which class to create
                String method = args[1]; // which method to invoke
                String param  = args[2]; // parameter to that method
        
                Class c  = Class.forName(clazz);
        
                Method m = c.getMethod(method, Object.class);
                Object o = c.newInstance();
        
                Object result = m.invoke( o, param );
                System.out.printf("%s.%s(%s)=%s", clazz, method, param, result );
        
            }
        }
        

        示例输出:

        $ java InvokeMethod java.util.ArrayList add  "Hello world"
        
        java.util.ArrayList.add(Hello world)=true
        
        $ java InvokeMethod java.lang.String valueOf  "Hello world"
        
        java.lang.String.valueOf(Hello world)=Hello world
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多