从String设置对象名称

时间:2014-03-10 04:43:35

标签: java string reflection instantiation

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

new instancename java.util.Arraylist

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

4 个答案:

答案 0 :(得分:1)

引用创建的对象的变量的名称未定义对象,并且在运行时期间无法分配。因此,要创建一个“名称”以引用一个对象,并且稍后可以通过“脚本”(您提到的字符串)使用此对象,您需要自己实现它。

执行此操作的一种方法是使用Map< String,Object>,您可以在其中添加名称,并在每次创建新对象时将(Map的)值指向对象(处理字符串时如示例)。这种方法的问题在于,如果您从不删除此Map条目,垃圾收集器将永远不会从内存中释放此对象。要解决这个问题,您应该在“脚本”中使用某种方法来判断何时释放创建的对象。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

用于保存引用的变量名称是:

  • 不相干
  • 仅在编译时间
  • 时可用

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

接近你想要的是使用Map:

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

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

答案 3 :(得分:0)

以下程序创建您指定的类的实例,然后使用类型为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