ClassCache

クラスのメタ情報を取得することが多くなってきたため、Android SDKにおけるリフレクションの戦略を考えようと思って、まずはClass.javaがどのように書かれているかを調べてみたがこんな記述を見つけた。

ClassCache getClassCache() {
    ClassCache cache = null;

    if (cacheRef != null) {
        cache = cacheRef.get();
    }

    if (cache == null) {
        cache = new ClassCache(this);
        cacheRef = new SoftReference>(cache);
    }

    return cache;
}

getClassCacheメソッドは内部でメソッドとフィールドを取得際に使用しており、明らかにクラスのメタ情報キャッシュするのが目的のクラスのようだ。(SoftReferenceというのが曲者だが)

class ClassCache {
    private final Class clazz;
    private volatile Method declaredMethods;
    private volatile Method declaredPublicMethods;
    private volatile Method allMethods;
    private volatile Method allPublicMethods;
    private volatile Field declaredFields;
    private volatile Field declaredPublicFields;
    private volatile Field allFields;
    private volatile Field allPublicFields;
    private volatile T enumValuesInOrder;
    private volatile T enumValuesByName;
    :
    :

Java6でメタ情報がキャッシュされていたのは知っていたが、Android SDKも少なくともMethodとFieldに関しては自前でキャッシュする必要は無さそうだ。(enumを序別にキャッシュしているのは効果があるんだろうか)

残るはコンストラクタアノテーションだが、コンストラクタ情報は使わない方向で。アノテーションは以前にバグ報告した際にnativeで書かれていることが判ったので、キャッシュは省こう。