MOP, Meta-object Protocolとは, プログラム自身をプログラミングの対象として扱う時のAPIです. もっとおおざっぱに言うと, Javaのリフレクションをもっと使いやすく, 柔軟に, 強力に, 綺麗にしたようなものだと思えばいいでしょう. ある意味ではいわゆるアスペクト指向プログラミングもここに含まれます (それをもっと汎用的にしたものです).
GroovyのMOPはいちばん基底では, インタフェイスgroovy.lang.MetaObjectProtocolで規定されています.
- MetaClass extends MetaObjectProtocol
- MutableMetaClass extends MetaClass
- MetaClassImpl implements MutableMetaClass
- ExpandoMetaClass extends MetaClassImpl
- ProxyMetaClass extends MetaClassImpl
- MockProxyMetaClass extends ProxyMetaClass
- ClosureMetaClass extends MetaClassImpl
1から3までが普通のGroovyObjectのメタクラスを表しています. 1,2 はインタフェイスで, 3はクラスです.
4から7はちょっと特殊なメタクラスです. メタクラスのレベルでいくらでもぐりぐりいじれちゃう, みたいなメタクラスも含まれています.
MOPを簡単に見てみると,
- properties - プロパティの一覧
- methods - メソッドの一覧
- respondsTo - あるメソッド名+引数のメッセージを受け付けるかどうか
- hasProperty - あるプロパティを持っているかどうか
- invokeMethod - あるメソッド名+引数でメソッドを起動
- getProperty/setProperty - ある名前のプロパティにアクセス
- addInstanceMethod - メソッドの追加
おおざっぱにはこんなAPIを用意していれば, メタレベルで如何様に操れる, と言うことです. 言い換えればオブジェクトの (実行時の) 本質はたかだかこんなものだとも言えます. つまり, オブジェクトとはMapにメッセージを受け付ける機構, 受け付けたメッセージからメソッドを探索する機構, 探索したメソッドを起動する機構を付け加えたものなのです.
今日はここまで.