我正在尝试制作一个 Java 应用程序,该应用程序可以加载实现抽象类的插件,并且在从 ServiceLoader 生成的实例中出现 AbstractMethodError。代码有点重,所以我在下面做了一个简化。
首先,我有一个抽象类:
package stuff.TheAbstractClass;
public abstract class TheAbstractClass implements ClassInterface{
//Stuff happens
}
它实现了以下接口:
package stuff.ClassInterface;
public interface ClassInterface {
public String getClassName();
}
我有一个服务提供商,它在 meta-inf/services 文件夹NotAbstractClass
中扩展和声明:TheAbstractClass
package anotherstuff.NotAbstractClass;
public final class NotAbstractClass extends TheAbstractClass implements ClassInterface{
private String name = "Silent Bob";
@Override
public String getClassName() { return name; }
}
然后在主应用程序(实际上是另一个应用程序中的插件)上,我想找到所有扩展的类TheAbstractClass
:
package stuff.TheApp;
import java.util.ServiceLoader;
public class TheApp {
private String name;
public final static TheApp INSTANCE = new TheApp();
private TheApp() {
ServiceLoader<TheAbstractClass> serviceLoader =
ServiceLoader.load(TheAbstractClass.class);
for (TheAbstractClass class: serviceLoader) {
name = class.getClassName;
}
}
我的应用程序确实找到了NotAbstractClass
. 我知道这一点,因为在 for 循环中,我可以这样做class.getName()
并且它会给我anotherstuff.NotAbstractClass
)但给出了错误:
java.lang.AbstractMethodError: stuff.TheAbstractClass.getClassName()Ljava/lang/String;
我难住了。有什么建议吗?谢谢你,佩德罗