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