メタプログラミング

  • プログラミング言語の処理系自体を操作するプログラミング技法
  • 実行時に処理系が持つメタ情報にアクセスしたり、処理系の基本動作に割り込んだり、コードの振る舞いを動的に変更したりするもの
  • メタプログラミングを使えば、言語仕様や処理系が持つ制約を超えた、柔軟で動的な処理を実現することができる
  • メタプログラミングを濫用するとコードの可読性を下げ、デバッグや保守が困難なコードを生み出すリスクも併せ持っている
  • キーワード:カテゴリ、MOP、メタクラス、フックメソッド

カテゴリ(Category)

  • 実行時に既存のクラスにメソッドを追加する仕組み
  • メソッドを追加するクラスはGroovyのクラスはもちろん、Javaのものでも、final修飾子がついているクラスでも良い
  • JDKの標準クラスやサードパーティ製のクラスなど、自分のコントロールが及ばないクラスライブラリを拡張するのに便利
  • DSLの実装手段としてもよく使われる

MOP(Meta Object Protocol)

  • ある言語のオブジェクトシステムをそのオブジェクトシステム自身によって記述したもの
  • GroovyのMOPの中心となるのはメタクラス(MetaClass)
  • メタクラスはGroovy/Javaのすべてのクラスやオブジェクトについて、実行時のメタ情報を保持し、その振る舞いを定義する
  • メタクラスを通じて、クラスやオブジェクトに関する情報を取得したり、クラスやメソッドを自動的に拡張したりすることができる
  • GroovyではgetMetaClass()メソッドを呼ぶことで、そのオブジェクトの動的な振る舞いを表すメタクラスを取得することができる
  • クラスオブジェクト(Classクラスのインスタンス)から取得したメタクラスは「クラス(ごと)のメタクラス」と呼ばれ、そのクラスのインスタンス全体の振る舞いを管理し、クラス全体に影響を与える
  • クラスオブジェクト以外のオブジェクトから取得したメタクラスは「インスタンスごとのメタクラス」と呼ばれ、そのインスタンス単体の振る舞いを管理する

管理人/副管理人のみ編集できます