javassist

Last-modified: 2008-01-01 (火) 07:45:50

07/08/23 作成者 - papiyon

javassist とは。

  • Java バイトコードを変換するライブラリ。
     などといきなり言われても何のことだかさっぱり見当が付かないであろう。
     詳しいことは下記の参考リンクをご参照頂ければ一目瞭然であるが、それではさっぱりしすぎて味気ないので
     この場を借りて概要を述べさせていただこうと思う。
     
     そんなことはいいから参考リンクを見せろというお方は当ページ最下部の参考リンクへ。
 
  • そもそもバイトコードとは何の事を指しているのか?
     javaのバイトコードとは、簡潔にいえば.classファイルのこと。
     辞書的説明は以下となる。

Javaのコンパイラが生成する実行用コードのこと。中間コードの一種で、特定の環境に依存しないという特徴を持つ。
JavaバイトコードはJava仮想マシン内のインタプリタによってネイティブコードに変換されてから実行される。

 
  • なぜバイトコードを変換するのか?
     バイトコードの変換→動的に既存クラスのメソッドなどを書き換える。また、既存のクラスに独自のフィールドやメソッドを追加できたり、新しいクラスの定義をJavaプログラムの中で作り出すことも出来る。
     
     これ以外の恩恵もある(らしい)のだが、とりあえずこれだけでもバイトコードの変換にチャレンジしてみる価値はあるのではないだろうか。(と筆者は思っている)
 
  • 使用例は?
     一番わかりやすい例としてEclipseなどのIDEが挙げられる。
     IDEはアプリケーションの実行中にjavaのソースコードから新しいクラスを生成する。
     
     『変換』の使用例は……むずかしいな。IDEの中でも使われているらしいのだが皆目見当が付かない。
     まぁきっとそれっぽい使い方があるのだろう。
     
  • API例
     引用

    表1: CtClass のメソッド (抜粋)
     

    String getName() クラス名を得る
    void setName(String name) クラス名を変更
    int getModifiers() 修飾子を得る
    void setModifiers(int m) 修飾子を変更
    CtClass getSuperclass() スーパークラスを得る
    void setSuperclass(CtClass c) スーパークラスを変更
    CtClass[] getInterfaces() インタフェースを得る
    void setInterfaces(CtClass[] i) インタフェースを変更
    CtField[] getFields() 全フィールドを得る
    void addField(CtField f) フィールドを追加
    CtMethod[] getMethods() 全メソッドを得る
    void addMethod(CtMethod m) メソッドを追加
    CtConstructor[] getConstructors() コンストラクタを得る
    void addConstructor(CtConstructor c) コンストラクタを追加
    void writeFile() クラス定義をファイルに保存
    Class toClass() クラスをロード
    byte[] toBytecode() クラス定義の中身を得る

参考:

 Javassist -- Java バイトコードを操作するクラスライブラリ -- 入門
  何はともあれここを読め。みたいな?

 

 Wizard Bible -- 第1章: マニアックJavaプログラミング第6回: ~ Javaでメタプログラミング ~
  メタプログラミング=eval
  evalについてはwikipediaあたりを参考に。eval
  アプリケーション内で動的にコードを生成し実行すること。

 

 Javassistチュートリアル:1.バイトコードの読み書き
  コーディングの仕方。