Ich möchte eine Implementierung zur Laufzeit für eine abstrakte Klasse mit Byte Buddy erstellen und ich bin mit dem Problem konfrontiert, dass eine java.lang.AbstractMethodError
geworfen wird beim Aufrufen einer Methode aus einer erstellten Instanz . Ich habe eine vorhandene abstract
Klasse wie folgt (die ich eigentlich nicht ändern und die enthält tatsächlich mehr Logik):Byte-Buddy: Erstellen Sie die Implementierung für eine abstrakte Klasse
public abstract class Algorithm {
abstract int execute();
}
die folgenden minimalen Proben verwenden, würde ich meine Algorithm
Instanz wie einen konstanten Wert zurückzukehren:
Class<?> type = new ByteBuddy()
.subclass(Algorithm.class)
.method(ElementMatchers.named("execute"))
.intercept(FixedValue.value(42))
.make()
.load(classLoader, ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
Algorithm instance = (Algorithm) type.newInstance();
System.out.println(myInstance.execute());
Dies führt jedoch zu folgenden Ausnahme:
Exception in thread "main" java.lang.AbstractMethodError: package.Algorithm.execute()I
(wenn ich Algorithm
experimentell ändern ein interface
, alles funktioniert gut, aber das löst nicht mein spezifisches Problem).
Danke Rafael für Ihre sehr ausführliche Erklärung berufen, als Chance wird es haben, entdeckte ich nur zwei Minuten vor, dass die Wurzel meines Problem verursacht wurde die Tatsache, dass die abstrakte Methode Paket privat war. Die "Injektion" ist meine Lösung. Übrigens, toller Job bei Byte Buddy! – qqilihq