我正在写一些图书馆。那里有一个抽象课。客户端代码需要扩展它以使用某些方法。可能会发生用户退出应用程序并在重新启动它之后我需要恢复对他的concrette类的引用。我的想法是保存用户类的规范名称,然后只为其创建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
,我给它一个concrette用户类的实例。
更新:为了方便起见:在我的库中我有一个类似上面的方法,参数a
是对客户端的ConcretteClass的引用,正如我们在第二行的输出中看到的那样。然后我失去了我的参考。如果我所知道的唯一的东西是ConcretteClass的规范名称,我怎样才能创建一个新的ConcretteClass实例?
答案 0 :(得分:0)
你的方法不起作用。
如果要“恢复”实例,则应该以其他方式执行,而不仅仅是newInstance。这是一回事。我不知道你的具体要求,所以我无法进一步回答“恢复”部分。
我说你的方法不起作用,因为你说你正在写一个“库”,所以我猜客户端代码会导入你的类,也就是说,你的抽象类是在客户端代码的类路径中。但是,客户端类不会在您的类路径中。这就是为什么你得到了classnotfound Ex。
就像我从番石榴扩展一个类一样,如何使用番石榴代码,它知道我的类并创建我的类的实例?