J'essaie de faire ce qui suit en ce qui concerne Refleciton, dites-moi si c'est possible.
public class A {
void start(){
execute();
}
}
public class B extends A {
void execute()
{
doWork();
}
public abstract void doWork();
}
J'ai regroupé les classes ci-dessus dans un jar et je l'ai fait tourner sur une JVM. Maintenant, j'essaie de créer une autre classe au moment de l'exécution, de la compiler au moment de l'exécution et d'essayer d'utiliser la réflexion pour invoquer la fonction execute() de la classe B.
public class C extends B {
@Override
public void doWork()
{
//Implementation
}
}
Code de réflexion :
Classloader = urls des jars de l'application et url de C.class, compilés au moment de l'exécution. Chargeur parent - Thread.currentThread().getContextClassLoader() Je configure également le chargeur de classe du contexte du thread actuel avec le chargeur de classe créé ci-dessus.
Class<? extends B> cls = (Class<? extends B>) Class.forName("className", true, clsLoader);
Object obj = cls.newInstance();
Method method = obj.getClass().getSuperclass().getMethod("start", new Class[0]);
method.invoke(obj, new Object[0]);
Je suis capable d'obtenir la méthode et l'invoke est également appelé. Cependant, lorsque l'exécution de la classe B est appelée, elle tente d'appeler la méthode doWork() et je me heurte alors à une AbstractMethodError. En faisant des recherches sur l'exception, je vois que l'exception se produit avec des classloaders/jars incorrects. Mais je ne suis pas sûr de la manière dont je dois m'y prendre pour la corriger dans mon cas.
Quelqu'un peut-il m'aider ?