平时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();
}