0

我正在写某种图书馆。我在那里有一个抽象类。客户端代码需要对其进行扩展以使用某些方法。可能会发生用户退出应用程序,在他重新启动应用程序后,我需要恢复对他的具体类的引用。我的想法是保存用户类的规范名称,然后就可以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 实例?

4

1 回答 1

0

你的方法行不通。

如果您想“恢复”实例,您应该以其他方式而不是简单地使用 newInstance。这是一回事。我不知道您的具体要求,所以我无法进一步回答“恢复”部分。

我说你的方法行不通,因为你说你正在写一个“库”,所以我猜客户端代码会导入你的类,也就是说,你的抽象类在客户端代码的类路径中。但是,客户端类不会在您的类路径中。这就是你得到classnotfound Ex的原因。

就像我从番石榴扩展一个类一样,例如,番石榴代码是如何出现的,它知道我的类并创建我的类的实例?

于 2013-07-11T22:24:15.320 回答