[英]Static Method which uses reflection
我目前正在尝试反思,最近遇到了一个问题。 我有这个方法,它计算仅由原始类型字段(布尔值除外)组成的类的大小(单位:字节),如下所示:
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()
但是这基本上会破坏扩展Foo
类的getSize()
的语义。 我目前认为这是不可能的,因为不会继承静态方法,但是我不确定100%是否可能有一些调整来处理此问题。
那么做类似的事情怎么了
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;
}
代替getClass(),可以使用Foo.class获取对Class对象的引用。
但是,如果您需要类Foo的实例,则仍必须在某个地方创建它。 如果该类具有默认构造函数,则可以使用Foo.class.newInstance()。 否则,请使用反射来获取构造函数列表并调用正确的构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.