我目前正在尝试反思,最近我遇到了一个问题。我有这个方法,它计算一个只包含原始类型字段(不包括布尔值)的类的大小(单位:字节),如下所示:
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()
和this
。但是,对于此类的每个实例,getSize()
的返回值都是相同的,这也适用于扩展Foo
的每个类(当然,具有不同的值)。因此,概念上getSize()
具有静态性质。
有没有办法让这个方法保持静态?我想过使用像Foo.class
这样的静态类引用来绕过getClass()
,但这基本上会破坏扩展getSize()
的类的Foo
的语义。我目前不认为这是可能的,因为静态方法不是继承的,但我不是100%确定是否可能有一点调整来处理这个问题。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
您可以使用Foo.class来获取对Class对象的引用,而不是getClass()。
但是,如果你需要一个类Foo的实例,你仍然需要在某个地方创建它。如果类具有默认构造函数,则可以使用Foo.class.newInstance()。否则,使用反射来获取构造函数列表并调用正确的构造函数。