1

私は現在リフレクションを試していますが、最近質問に出くわしました。このメソッドがあります。このメソッドは、プリミティブ型のフィールド(ブール値を除く)のみで構成されるクラスのサイズ(単位:バイト)を次のように計算します。

import java.lang.reflect.Field;

public class Foo {

    // [...]   

    // Works only for classes with primitive typed fields (excluding booleans)
    public int getSize() {
        int size = 0;

        for (Field f : getClass().getDeclaredFields()) {
            try {
                f.setAccessible(true);
                Object obj = f.get(this);
                Field objField = obj.getClass().getDeclaredField("SIZE");
                int fieldSize = (int) objField.get(obj);
                size += fieldSize / Byte.SIZE;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return size;
    }

}

ご覧のとおり、メソッドにはgetClass()andのような非静的なものが含まれているため、静的にすることはできませんthis。ただし、このクラスのすべてのインスタンスの戻り値はgetSize()同じになります。これは、拡張するすべてのクラスにも当てはまりますFoo(もちろん、異なる値で)。したがって、概念的getSize()には静的な性質を持っています。

このメソッドを静的にする方法はありますか?Foo.class回避するために静的クラス参照を使用することを考えましたが、これは基本的に、を拡張するクラスgetClass()のセマンティクスを破壊します。静的メソッドは継承されないため、現時点では不可能だと思いますが、この問題を処理するための微調整があるかどうかは100%わかりません。getSize()Foo

4

2 に答える 2

0

だから、次のようなことをすることの何が問題になっていますか

public static int getSize(Object parent) {
    int size = 0;

    for (Field f : parent.getClass().getDeclaredFields()) {
        try {
            f.setAccessible(true);
            Object obj = f.get(parent);
            Field objField = obj.getClass().getDeclaredField("SIZE");
            int fieldSize = (Integer) objField.get(obj);
            size += fieldSize / Byte.SIZE;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    return size;
}
于 2012-09-20T04:14:49.317 に答える
0

getClass()の代わりに、Foo.classを使用してClassオブジェクトへの参照を取得できます。

ただし、クラスFooのインスタンスが必要な場合でも、どこかに作成する必要があります。クラスにデフォルトのコンストラクターがある場合は、Foo.class.newInstance()を使用できます。それ以外の場合は、リフレクションを使用してコンストラクターのリストを取得し、正しいコンストラクターを呼び出します。

于 2012-09-20T04:45:10.310 に答える