首先来看一下官方文档给的相关信息:
Inner classes or anonymous classes are not supported. Note that this is a limitation of the compiler only. It cannot compile source code including an anonymous-class declaration. Javassist can read and modify a class file of inner/anonymous class.
这段描述是Javassist Limitations的一个点,大致的意思是:Javassist不支持内部类和匿名类,但这仅仅是对编译的限制。如果源码中包含匿名类则不能编译,但是Javassist可以读取并修改Class中原有的内部类和匿名类。
***这里解释一下“源码中包含匿名类则不能编译”这句话,因为Javassist可以直接将代码片段插入class字节码中,这里的源码就指的是插入的代码片段。
好了,上代码:
1.内部类
public class InnerClass {
public class PublicClass{
public void hello(){
System.out.println(String.valueOf("Hello Public Inner Class"));
}
}
private class PrivateClass{
public void hello(){
System.out.println(String.valueOf("Hello Private Inner Class"));
}
}
public void publicClassHello(){
PublicClass publicClass = new PublicClass();
publicClass.hello();
}
public void privateClassHello(){
PrivateClass privateClass = new PrivateClass();
privateClass.hello();
}
}
这里我们先创建一个包含内部类的InnerClass,其中PublicClass和PrivateClass为两个内部类。
import javassist.*;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;
import java.util.Arrays;
public class ModifyInnerClass {
public ClassPool pool = ClassPool.getDefault();
public void modifyPublicClass() {
try {
/*
首先获取InnerClass的CtClass,pool其实是一个以className为Key,CtClass对象