droidsensor

以下にてソース取得。

$ svn checkout http://droidsensor.googlecode.com/svn/trunk/ droidsensor-read-only

で、その中にある BluetoothExample を確認。ざっくり確認したトコロでは

  • onCreate で
    • BluetoothDeviceStub なオブジェクト生成
    • BroadcastReceiver なオブジェクト生成
    • レシーバを登録
  • onDestroy で
    • レシーバの登録解除

な模様。詳細は置いといて Factory Method とか BluetoothDeviceStub とかを確認してみる。

Factory Method

BluetoothDeviceStub は singleton なんかな。あとこの Stub も微妙に入り組んだ作り方してるように見えます。

		Object bluetoothService = context.getSystemService(SERVICE_NAME);
		BluetoothDeviceStub res = DelegatingProxyFactory.createProxy(
				BluetoothDeviceStub.class, bluetoothService);

DelegatingProxyFactory って何だ。ディレクトリ的には同じ階層にファイルがあります。

DelegatingProxyFactory

これも Factory Method 使ってるっぽい。しかも reflection 使いまくりでワケワカだ。

むむ。上記ドキュメントに書いてある事項を踏襲してるように見えますが抽象化度合いが激しい。

public class DelegatingProxyFactory {

	private static final DelegatingProxyFactory SINGLETON = new DelegatingProxyFactory();

	@SuppressWarnings("unchecked")
	public static <T> T createProxy(Class<T> type, Object underlying) {

		return (T) SINGLETON.createProxyInternal(type, underlying);
	}

	@SuppressWarnings("unchecked")
	private <T> Object createProxyInternal(Class<T> type, Object underlying) {

		InvocationHandler handler = new InvocationHandlerImpl(type, underlying);

		T proxy = (T) Proxy.newProxyInstance(type.getClassLoader(),
				new Class[] { type }, handler);

		return proxy;
	}

直下に InvocationHandlerImpl クラスの定義が記述されている。定義されてるメソドとしては

  • private な boolean isMethodStatic
  • private な Method getMethod
  • public な Object invoke

private なメソドは invoke から呼び出されている模様。どうも invoke は Proxy で作成したオブジェクトのメソドを呼び出しているように見えますな。何故にここまで抽象化する必要があるのかは分かりませんが、ざくっとそんな理解で良い気がしてます。

うーん

よく分からん。BluetoothSocketActivity クラスの BluetoothSocketActivity.this って一体何を指すのかが不明。inner が outer を指す時に、な書き方という記述はどっかで見つけたのですが、BluetoothSocketActivity って inner class にはなっていないッス。

で結局

ソースを俯瞰的に眺めてたら、DelegatingProxyFactory.createProxy() が戻してるソレは interface に見えるぞ、と思ってたらこのメソドに

		Object bluetoothService = context.getSystemService(SERVICE_NAME);

なソレを渡している。どうもこのオブジェクトが BluetoothDeviceStub なインターフェースを実装しているみたいに見えるな云々と考えてると作成されたご当人のエントリを発見。

どうも BluetoothDeviceStub なインターフェースは reflection で無理矢理探した風に見えるんですがこれはどうも物凄いですね。

とりあえず

上記エントリを参考にしつつ掘削してみます。メモは以下に追記予定。

今読んでるサンプルは上記エントリで使われてるものな模様。なるほど。おそらくはこれで若者はなんとか実装できるんじゃないかな、と思ってます。多謝。