我目前正在尝试反射,最近遇到了一个问题。我有这个方法,它计算一个只包含原始类型字段(不包括布尔值)的类的大小(单位:字节),如下所示:
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()
,但这基本上会破坏getSize()
扩展类的语义Foo
。我目前认为这是不可能的,因为静态方法不是继承的,但我不能 100% 确定是否有一些调整来处理这个问题。