2012-04-13 194 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