前言:
如今兄弟们对“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修改文件内容