字节码技术删除类方法

平时crud的话字节码应用不多,也不太了解这方面,然后最近同事遇到一个问题,写单元测试的时候,new一个类总是报错,于是看类源码发现有个静态方法,这个方法上面还有个@Nonnull注解,而且参数也有这个注解,参数是一个sdk的实体类对象,但是sdk的jar文件不在项目里面,所以构造的时候,执行静态方法,检查参数,然后报了NoClassDefFoundError异常。因为是写单元测试,在不能修改源码的情况下,我想到了用字节码动态删除类方法来试一下。
(伪代码)

需要删除的静态方法

 @Nonnull
  public static User need(@Nonnull Shun s) {
    // 方法体省略
  }

User user= new User()的时候,执行need(Shun s)静态方法,由于Shun类找不到,构造失败。

动态字节码删除need静态方法

String className = "com.xxx.xxx.User";
User user= null;
    try {
    // 获取字节码对象
      CtClass ctClass =  ClassPool.getDefault().get(className);
      //根据方法名获取方法
      CtMethod[] ctMethods = ctClass.getDeclaredMethods("need");
      //删除方法
      ctClass.removeMethod(ctMethods[0]);
      Class c = ctClass.toClass();
      //反射
      user = (User)c.newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值