龙空技术网

javassist字节码技术修改java类结构

九天银河888 167

前言:

如今兄弟们对“java修改文件内容”大致比较关心,大家都需要分析一些“java修改文件内容”的相关内容。那么小编在网上汇集了一些有关“java修改文件内容””的相关内容,希望各位老铁们能喜欢,同学们一起来学习一下吧!

问题场景

在一次项目开发碰到了一个这样的问题。项目采用SSM架构,在代码生成工具中引用了MyBatis包中, 其中有一个方法把LONGVARCHAR类型判断为BLOB字段,这个不是预想得到的结果。因技术能力有限,无法对MyBatis源码进行修改编译。因此采用了javassist字节码技术对该方法进行了修改,轻松解决这个问题。今天就聊一聊javassist字节码技术!

代码编辑

这是一个简单的类

public class Person {    public void say() {        System.out.println("神秀说:");        System.out.println("身是菩提树,心如明镜台。");        System.out.println("时时勤拂拭,勿使惹尘埃。");    }}

执行say()方法,结果为:

以下为javassist对上面的类进行修改的代码

public class JavassistTest {    public static void main(String[] args) throws NotFoundException, CannotCompileException {              ClassPool pool = ClassPool.getDefault();        CtClass cc = pool.get("com.zhangls.javassist.Person");//获取类        CtMethod goMethod = cc.getDeclaredMethod("say");//获取方法        cc.removeMethod(goMethod);//删除方法              CtMethod ctMethod = new CtMethod(CtClass.voidType, "say", new CtClass[]{}, cc);//重新定义方法        StringBuilder methodBody = new StringBuilder();        methodBody.append("{");        methodBody.append("System.out.println(\"惠能说:\");");        methodBody.append("System.out.println(\"菩提本无树,明镜亦非台。\");");        methodBody.append("System.out.println(\"本来无一物,何处惹尘埃。\");");        methodBody.append("}");        ctMethod.setBody(methodBody.toString());        cc.addMethod(ctMethod);// 增加新方法        cc.toClass();//此过程不能少        Person person=new Person();        person.say();    }}
运行结果

可以看到原Person类say方法被修改了!惠能在境界上比神秀站得更高!不知道一直在“时时勤拂拭”的神秀,如果真的发现“本来无一物”的时候,有没有大半辈子白忙活的感想!

代码说明

1. 在javassist修改完Person类say方法,重新实例调用say方法前一定要先调用执行cc.toClass(),否则仍执行未修改前的方法。

2. 在javassist修改Persono类前,不能实例化Person,否则会有报错。当然也有解决方案,有兴趣的可以自行解决。

每天一个小知识,每天进步一点点!!![加油][加油][加油]

标签: #java修改文件内容