我必须使用反射创建对象,但是我遇到了如何设置字符串中指定的实例名称的问题,例如该字符串包含:
new instancename java.util.Arraylist
其中 instancename 是指Arraylist的新实例,我知道如何通过反射创建一个对象,但我无法找到一种方法从字符串为实例分配一个特定的名称。任何帮助?提前谢谢。
答案 0 :(得分:1)
引用创建的对象的变量的名称未定义对象,并且在运行时期间无法分配。因此,要创建一个“名称”以引用一个对象,并且稍后可以通过“脚本”(您提到的字符串)使用此对象,您需要自己实现它。
执行此操作的一种方法是使用Map< String,Object>,您可以在其中添加名称,并在每次创建新对象时将(Map的)值指向对象(处理字符串时如示例)。这种方法的问题在于,如果您从不删除此Map条目,垃圾收集器将永远不会从内存中释放此对象。要解决这个问题,您应该在“脚本”中使用某种方法来判断何时释放创建的对象。
答案 1 :(得分:0)
答案 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