我试图了解 Java Service Loader 的工作原理?我遇到了这个博客:
您能否帮助我理解作者为何声称:
实现必须有一个公共的无参数构造函数。
好的,我得到了第一部分。现在是一个后续问题。我可以将其作为后续问题发布,但认为将其作为同一问题的一部分会更好。
考虑java 文档:
它说:
此外,必须编译非私有内部成员类的构造函数,使其第一个参数是表示直接封闭实例的附加隐式参数(第 8.1.3 节)。
这是否意味着我不能将内部类外部化。请考虑以下代码:
import java.io.*;
class Y {
class ABC {
ABC() {
System.out.println("ABC Constructor");
}
public void writeExternal(ObjectOutput out)
throws IOException {
System.out.println("ABC.writeExternal");
}
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException {
System.out.println("ABC.readExternal");
}
}
public void foo() throws IOException, ClassNotFoundException {
System.out.println("Constructing objects:");
ABC abc = new ABC();
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("InnerClass.out"));
System.out.println("Saving objects:");
o.writeObject(abc);
o.close();
// Now get them back:
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("InnerClass.out"));
System.out.println("Recovering abc:");
// OOPS! Throws an exception:
abc = (ABC)in.readObject();
}
}
public class InnerClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println("Hello World\n");
Y y = new Y();
System.out.println(y);
y.foo();
}
}
它在运行时失败:
Hello World
Y@6bc7c054
Constructing objects:
ABC Constructor
Saving objects:
Exception in thread "main" java.io.NotSerializableException: Y$ABC
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at Y.foo(InnerClass.java:24)
at InnerClass.main(InnerClass.java:40)
如何使用 Externalize 类 ABC?
谢谢