2016-09-28 3 views
1

Ich versuche Aufrufe von JavaFX 'ScenePulseListener.pulse() Methode mit ByteBuddy 1.4.26 abzufangen.Warum wird mein ByteBuddy Interceptor nicht aufgerufen?

Der folgende Code scheint richtig zu dieser Klasse und Verfahren zu verweisen, und die Methode Unterschrift des Interceptor scheint korrekt zu sein, wie bei Manipulationen, dass richtig Ausnahmen auslöst.

(installJavaFXPulseInterceptor() wird aufgerufen, bevor die ScenePulseListener Klasse geladen wird.)

Jedoch ist die Abfangjäger Methode nie aufgerufen, wenn ScenePulseListener.pulse() ist: Was mache ich falsch?

Antwort

0

Sie sollten diesen Ansatz nicht verwenden, da Sie nicht garantieren können, dass die Klasse noch nicht geladen ist, wenn Sie versuchen, den Typ zu injizieren. Dies funktioniert praktisch nur, wenn vor dem Code nichts geladen wird, d. H. Direkt nachdem die main-Methode aufgerufen wurde.

Idealerweise sollten Sie einen Java-Agenten für solche Transformationen definieren.

public class Foo { 
    public void pulse() { 
    System.out.println("foo"); 
    } 
} 

Und sehen, ob Ihre Transformation funktioniert es:

Sie können Ihre Abfangjäger durch die Definition einer Klasse validieren. Stellen Sie sicher, dass die Klasse vor der Umwandlung nicht geladen wird. Wenn Sie dies auf meinem Computer tun, wird gezeigt, dass Ihr Codebeispiel bereits geladen ist.

Sind Sie sicher, dass der Systemklassenlader Ihre JavaFx-Klasse in Frage stellt? Was sagt Pulse.class.getClassLoader()?

+0

Yup, 'installJavaFXPulseInterceptor()' wird direkt in der 'main (...)' -Methode aufgerufen (ich würde den Agentenweg lieber vermeiden, wenn ich kann), aber tatsächlich der Klassenlader, der den 'ScenePulseListener' lädt Klasse ist nicht das System eins, sondern die Erweiterung eins! Wenn ich ByteBuddy zwingen, alles mit dem Klassenlader zu tun, der lädt, z. 'javafx.application.Platform' (dessen Laden' 'ScenePulseListener' nicht geladen wird), sieht es so aus, als ob die Dinge weiter gehen, da ich am NoClassDefFoundError (PulseInterceptor) gelandet bin ... ;-) Lassen Sie uns das nach einem Gute Nacht ... Vielen Dank für Ihre Hilfe! –

Verwandte Themen