2012-04-13 197 views
3

我想用Javassist來測試一個Java不在我控制範圍內的Java類(Java 1.6.0_26-b03,Javassist 3.16.1-GA)。使用Javassist來檢測父類的私有方法?

我對Javassist比較陌生,但認爲我知道背後的概念。我讀了很多,但也許我錯過了一些東西。請參閱下面的,很簡單的代碼:

文件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(); 
    } 
} 

文件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(); 
    } 
} 

文件Child.java:

package test.javassist; 

public class Child extends Parent 
{ 

} 

當我運行這個程序時,輸出是:

Parent.parent() 
Parent.privateParent() 

所以我的問題是,爲什麼沒有行「 - 之前父() - 」,我認爲已插入字節碼?

是不是可以做我嘗試過的父類的私有方法的代碼插入?

非常感謝您的幫助!

回答

3

感謝框架作者的幫助,我得到了一個問題的提示,我想在這裏分享解決方案。由於我修改父類的方法,這個類必須還裝載了

childCtClass.getSuperclass().toClass(); 

parentCtMethod.insertBefore 

我要感謝千葉繁教授之後。

+1

@它是Leto:請編輯並放置您的最終完整版本。它將作爲一個很好的參考 – Jayan 2012-04-16 12:54:27