Vorrei creare un'implementazione in fase di esecuzione per una classe astratta utilizzando Byte Buddy e sto affrontando il problema, che viene generato un java.lang.AbstractMethodError
quando si richiama un metodo da un'istanza creata . Ho un abstract
classe esistente come questo (che in realtà non può modificare e che in realtà contiene più logica):Byte Buddy: creazione dell'implementazione per una classe astratta
public abstract class Algorithm {
abstract int execute();
}
Utilizzando il seguente esempio minimale, vorrei che la mia Algorithm
esempio per restituire un valore costante:
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());
Questo però porta alla seguente eccezione:
Exception in thread "main" java.lang.AbstractMethodError: package.Algorithm.execute()I
(quando ho sperimentalmente cambio Algorithm
a un interface
, tutto funziona bene, ma questo non risolve il mio problema specifico).
Grazie Rafael per la vostra spiegazione molto dettagliata, guarda caso avrà, ho appena scoperto due minuti fa, che la radice del mio problema è stato causato da il fatto, che il metodo astratto era un pacchetto privato. L'INIEZIONE è la mia soluzione. Btw, ottimo lavoro su Byte Buddy! – qqilihq