我正在写某种图书馆。我在那里有一个抽象类。客户端代码需要对其进行扩展以使用某些方法。可能会发生用户退出应用程序,在他重新启动应用程序后,我需要恢复对他的具体类的引用。我的想法是保存用户类的规范名称,然后就可以newInstance()
了。但是由于某种原因,它无法创建实例。我做了一个测试:
void foo(AbstractClass a) {
String classname = a.getClass().getCanonicalName();
System.out.println(classname); //Output: "com.test.clientcode.Main.ConcretteClass"
a = null; // here I lost my reference to ConcretteClass for example, so all I have is a classname
Class.forName(classname).newInstance(); //Throws exception: "java.lang.ClassNotFoundException: `com.test.clientcode.Main.ConcretteClass"
}
这是库代码中的一种方法。作为论点a
,我给它一个具体用户类的实例。
更新:为了让事情变得更容易:在我的库中,我有一个类似上面的方法,参数a
是对客户端的 ConcretteClass 的引用,正如我们在第二行的输出中看到的那样。然后我失去了我的参考。如果我唯一知道的是 ConcretteClass 的规范名称,我该如何创建一个新的 ConcretteClass 实例?