over 4 years ago

複数のOSバージョンにまたがるアプリケーションサポートや、特殊な状況でprivate、protectedなメソッドにアクセスしたい場合、リフレクションが便利です。

privateメソッドを外部から呼びたい場合、getDeclaredMethodでMethodインスタンスを取得してsetAccessibleでアクセス可能にすることで実現可能性になります。

AlternatedGCMBroadcastReceiver receiver = new AlternatedGCMBroadcastReceiver();
Object[] param = new Object[] {getContext()};
Method method = receiver.getClass().getDeclaredMethod("getGCMIntentServiceClassName", Context.class);
method.setAccessible(true);
String result = (String) method.invoke(receiver, param);

※ getGCMIntentServiceClassNameはgcm.jarで提供されるGCMBroadcastReceiverのメソッドです。

古いOSをサポートしつつ新しいOSでは最適な処理(もしくは不具合回避等...。)を実行したい場合はもっとシンプルです。

TextView textView = (TextView) findViewById(R.id.text);
Oject[] param = new Object[] { 1, null };
textView.getClass().getMethod("setLayerType", int.class, Paint.class).invoke(textView, param);

Build.VERSIONで分岐させつつこの処理を実行したりします。リフレクションを使う

← Android Holo Colors Generator - Android Holo ベースのテーマを作成する 特定commitかつバイナリ込みのパッチを生成する →