[英]Instance of client implementation of abstract class in library code
我正在写某种图书馆。 我在那里有一个抽象课。 客户端代码需要扩展它以使用某些方法。 用户退出应用程序可能会发生,并且在重新启动应用程序后,我需要恢复对他的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
我给它一个concreette用户类的实例。
更新:使事情变得容易:在我的库中,我有一个如上所述的方法,参数a
是对客户端的ConcretteClass的引用,正如我们在第二行的输出中看到的那样。 然后我失去了参考。 如果我只知道ConcretteClass的规范名称,该如何创建ConcretteClass的新实例?
您的方法行不通。
如果要“还原”该实例,则应以其他方式而不是简单地执行newInstance。 这是一回事。 我不知道您的具体要求,因此我无法在“还原”部分做进一步回答。
我说您的方法行不通,因为您说自己正在编写“库”,所以我猜想客户端代码将导入您的类,也就是说,抽象类位于客户端代码的类路径中。 但是,客户端类将不在您的类路径中。 这就是为什么您获得classnotfound Ex的原因。
就像我从番石榴扩展一个类一样,番石榴代码如何出现,它知道我的类并创建我的类的实例?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.