Javassist修改Class中的内部类(inner class)和匿名类(anonymous class)

首先来看一下官方文档给的相关信息:

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对象
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值