2012-04-13 5 views
3

Ich möchte Javassist verwenden, um eine Java-Klasse zu instrumentieren, deren Quelle ich nicht kontrolliere (Java 1.6.0_26-b03, Javassist 3.16.1-GA).Mit Javassist eine private Methode einer Elternklasse instrumentieren?

Ich bin relativ neu zu Javassist, aber denke ich kenne die Konzepte dahinter. Ich habe viel darüber gelesen, aber vielleicht habe ich etwas übersehen. Bitte finden Sie in der folgenden, wirklich einfachen Code:

Datei ParentPrivateMethodInstrumentingTest.java:

package test.javassist; 

import javassist.*; 

public class ParentPrivateMethodInstrumentingTest 
{ 
    public ParentPrivateMethodInstrumentingTest() throws Exception 
    { 
     ClassPool classPool = ClassPool.getDefault(); 

     CtClass childCtClass = classPool.get("test.javassist.Child"); 
     CtMethod parentCtMethod = childCtClass.getMethod("parent", "()V"); 

     parentCtMethod.insertBefore("{ System.err.println(\"-- before parent() --\"); }"); 

     Child child = (Child)childCtClass.toClass().newInstance(); 
     child.parent(); 
    } 

    public static void main(String[] args) throws Exception 
    { 
     new ParentPrivateMethodInstrumentingTest(); 
    } 
} 

Datei Parent.java:

package test.javassist; 

public class Parent 
{ 
    private void privateParent() 
    { 
     System.out.println("Parent.privateParent()"); 
    } 

    public void parent() 
    { 
     System.out.println("Parent.parent()"); 
     privateParent(); 
    } 
} 

Datei Child.java:

package test.javassist; 

public class Child extends Parent 
{ 

} 

Wenn ich dieses Programm starte, ist die Ausgabe:

Also meine Frage ist, warum gibt es keine Zeile "- vor Eltern() -", die ich in den Bytecode eingefügt wurde?

Ist es nicht möglich, Code-Einfügungen so zu machen, wie ich private Methoden von Elternklassen ausprobiert habe?

Vielen Dank für Ihre Hilfe!

Antwort

3

Dank der Hilfe des Autors des Framework habe ich einen Hinweis bekommen, wo das Problem liegt und ich möchte die Lösung hier teilen. Da ich ein Verfahren zur Herstellung einer übergeordneten Klasse ändern, muß diese Klasse auch mit

childCtClass.getSuperclass().toClass(); 

direkt nach der Zeile

parentCtMethod.insertBefore 

Mein Dank geht an Prof. Shigeru Chiba geladen werden.

+1

@ Es ist Leto: Bitte bearbeiten Sie und legen Sie Ihre endgültige vollständige Version. es wird als gute Referenz funktionieren – Jayan

Verwandte Themen