Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 库代码中抽象类的客户端实现实例_Java_Class - Fatal编程技术网

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

Java 库代码中抽象类的客户端实现实例,java,class,Java,Class,我在写某种图书馆。我在那里有一个抽象类。客户端代码需要扩展它以使用某些方法。可能用户退出了应用程序,在他重新启动后,我需要恢复对他的混凝土类的引用。我的想法是保存用户类的规范名称,然后为其创建newInstance()。但是由于某些原因,它无法创建实例。我做了一个测试: void foo(AbstractClass a) { String classname = a.getClass().getCanonicalName(); System.out.println(classna

我在写某种图书馆。我在那里有一个抽象类。客户端代码需要扩展它以使用某些方法。可能用户退出了应用程序,在他重新启动后,我需要恢复对他的混凝土类的引用。我的想法是保存用户类的规范名称,然后为其创建
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
是对客户机具体类的引用,正如我们在第2行的输出中看到的那样。然后我失去了我的推荐人。如果我只知道ConcretteClass的规范名,我如何创建ConcretteClass的新实例

你的方法行不通

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

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


就像我从guava扩展了一个类一样,例如,在guava代码中,它如何知道我的类并创建我的类的实例

用户可能退出应用程序,重新启动应用程序后,我需要恢复对其具体类的引用。
我没有得到它。在您的代码中,您没有保留引用,您正在尝试创建一个新实例。谢谢您的回复。是的,首先我引用了ConcretteClass的某个实例,并将其保存在抽象类类型的静态变量中。但是重新启动后,静态变量变为null,所以我需要用新的ConcreteClassis实例更新它。我已经更新了问题。好的,谢谢,我知道了。我的问题是:我需要在应用程序重启后保存对客户端具体方法实现的引用。所以我可以重用这个方法,而不必每次都向客户索要它。也许有其他方法可以解决这个问题?我觉得你的设计可能有一些问题。(不确定)。通常,库不应该知道客户机的类型。如果需要做与客户具体相关的事情,则应在客户代码中完成。不在图书馆。想想apache common、番石榴、spring、hibernate……甚至JDK本身都是如何工作的。@Kent不同意。Struts是一个在我们的项目中使用的库,但是可以实例化我们在Struts配置xml文件中定义的
Action
s和
ActionForm
s,Spring(使用xml)、Hibernate(实例化实体)和几乎所有Java框架也是如此。这就是反射的作用。