2016-06-20 4 views
2

Ich versuche, einige Code zu einer Klasse hinzuzufügen, die in einem Glas (Maven dependecy) ist, und ich mache es auf folgende Weise:Inject Code in Verfahren mit Javassist

ClassPool classPool = ClassPool.getDefault(); 

CtClass ctClass = classPool.get("xyz.abc.ClassInADependecy"); 

CtMethod method = ctClass.getDeclaredMethod("getSomeValue"); 

method.insertBefore("{ System.out.println(\"modified\"); }"); 

Ich bin mit Spring und der oben genannte Code wird mit einer @Configuration Annotation aufgerufen. Wenn ich die Methode getSomeValue anrufe, wird nichts gedruckt.

Können Sie mir helfen, herauszufinden, was ich falsch mache?

Vielen Dank.

Antwort

0

Sie ändern nur die Implementierung, da sie im Javaassists-Typenpool dargestellt wird. Sie müssen sicherstellen, dass die Klasse auch vom jeweiligen Klassenlader geladen wird. Dies muss auch geschehen, bevor die Klasse zum ersten Mal geladen wird, d. H. Bevor Ihre Spring-Anwendung diese Klasse lädt.

Eine Möglichkeit besteht darin, die Klasse von einem Java-Agenten zu bearbeiten: https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html