Ich versuche, eine Java-Anwendung zu erstellen, die Plugins laden kann, die eine abstrakte Klasse implementieren und einen AbstractMethodError mit den Instanzen haben, die von ServiceLoader generiert werden. Der Code ist ein bisschen schwer, daher habe ich unten eine Vereinfachung vorgenommen.Unterklasse erhalten von Serviceloader wirft AbstractMethodError
Zuerst habe ich eine abstrakte Klasse:
package stuff.TheAbstractClass;
public abstract class TheAbstractClass implements ClassInterface{
//Stuff happens
}
, die die unten Schnittstelle implementiert:
package stuff.ClassInterface;
public interface ClassInterface {
public String getClassName();
}
Ich habe einen Dienstleister NotAbstractClass
die TheAbstractClass
und Staaten so in einer Meta-inf erstreckt/Dienste-Ordner:
package anotherstuff.NotAbstractClass;
public final class NotAbstractClass extends TheAbstractClass implements ClassInterface{
private String name = "Silent Bob";
@Override
public String getClassName() { return name; }
}
Dann auf dem Mai n-Anwendung (das ist eigentlich ein Plugin in einer anderen Anwendung ist), möchte ich alle Klassen finden, die TheAbstractClass
erweitern:
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;
}
}
Meine Anwendung tut NotAbstractClass
finden. Ich weiß, das da in der for-Schleife, ich class.getName()
tun können, und es gibt mir anotherstuff.NotAbstractClass
), sondern gibt den Fehler: java.lang.AbstractMethodError: stuff.TheAbstractClass.getClassName()Ljava/lang/String;
Ich bin ratlos. Irgendein Vorschlag? Vielen Dank, Pedro
Haben Sie Ihre Dienste so definiert, dass sie gemäß https://docs.oracle.com/javase/tutorial/ext/basics/spi.html#register-service-providers registriert sind? – hotzst
@hotzst, Tatsächlich habe ich.Ich weiß, dass es geladen ist, da ich in der for-Schleife "class.getName()" machen kann und es mir "anotherstuff.NotAbstractClass" gibt. –