繁体   English   中英

库代码中抽象类的客户端实现实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM