インスペクターを起動する

次のクラス InspectorPanel は、インスペクターの核となるパネルを規定します。

class InspectorPanel(JPanel):
def __init__(self, target):
self.target = target
self.layout = BorderLayout()
e = self.listView = JList(
listData=dir(target),
valueChanged=self.valueChanged,
)
self.add(JScrollPane(e), BorderLayout.WEST)
e = self.textView = JTextArea(
lineWrap=True,
)
self.add(JScrollPane(e), BorderLayout.CENTER)
e = self.helpView = JTextArea(
lineWrap=True,
)
self.add(JScrollPane(e), BorderLayout.SOUTH)

def valueChanged(self, e):
s = e.source.selectedValue
s = getattr(self.target, s)
self.textView.text = `s`
self.helpView.text = `type(s)`

def ex_Inspector():
target = JTextArea() # Here goes! (@.@)
frame = JFrame(
defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
title="inspect: %s"%target.__class__.__name__,
)
frame.add(InspectorPanel(target))
frame.pack()
frame.show()

おもな変更点は、型情報を表示するテキスト領域 helpView を追加したことです。ウィンドウのタイトルを見ると、どのインスタンスを確認しているかが分かります。

インスペクター自身を解析する

ここで、興味深い実験をしてみます。次のコードを断片を挿入して、

def ex_Inspector():
target = JTextArea() # Here goes! (@.@)
target = InspectorPanel(target) # What happens? (?_?)

再実行すると、次のようなインスペクターが現われます。ここで、何が起こっているか分かりますか。


実は、インスペクターを使って「インスペクター自身」を確認しているのです。試しに、リスト項目から helpView を選択すると とあることから、それが Java で記述された TextArea インスタンスだと分かります。これは、定義したばかりのクラス InspectorPanel のメンバー特性のひとつに他なりません。
《Tips》読者のみなさんはすでに「アプリケーション開発/ツール作成」を混乱している自分に気付いているかもしれません。しかし、そのシームレスな感覚こそが「オブジェクト指向」の醍醐味です。真の統合開発環境のもとでは「プログラミング言語/開発環境」は、コインの裏表に似て区別する必要はありません。どちらもアプリケーション開発に最適な形に進化しますが、それを促進するのがプログラマーの役割です。逆に、これらが進化しないとしたら、それはプログラマーの怠慢の証とも言えます。□