uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

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

ばっちりや。