javassist/Groovyでバイトコード加工をやってみた
とある目的のために、javaassistを使ったバイトコード加工(パッケージ名の変更)をgroovyでやってみた。
@Grab(group=’javassist’, module=’javassist’, version=’3.8.0.GA’) class Dummy1{} import javassist.bytecode.ClassFile; def convOnMemory(javaClass, before, after) { constPool = javaClass.constPool constPool.print() // for DBUG constPool.renameClass(before, after) constPool.print() // for DBUG return javaClass } def inf = new File(”Test.class”); def outf = new File(”ConvertedTest.class”); def classFile = new ClassFile(new DataInputStream(new FileInputStream(inf))) def converted = convOnMemory(classFile, “Test”, “Hoge”) converted.write(new DataOutputStream(new FileOutputStream(outf)))
これを「replacer.groovy」という名前で保存しときます。実行前の準備としては
class Test { public void foo(){} }
こんなJavaソースをコンパイルして、Test.classというクラスファイルを用意しておきます。
んで
$ groovy replacer.groovy
とすると、ConvertedTest.classというファイルが生成されていることでしょう。この中身をjavapで覗くと・・
$ javap ConvertedTest Compiled from “Test.java” class Hoge extends java.lang.Object{ Hoge(); public void foo(); }
ばっちりや。