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(),但这基本上会破坏getSize()扩展类的语义Foo。我目前认为这是不可能的,因为静态方法不是继承的,但我不能 100% 确定是否有一些调整来处理这个问题。

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

您可以使用 Foo.class 来获取对 Class 对象的引用,而不是 getClass()。

但是,如果您需要类 Foo 的实例,您仍然必须在某个地方创建它。如果类有默认构造函数,你可以使用 Foo.class.newInstance()。否则,使用反射获取构造函数列表并调用正确的构造函数。

于 2012-09-20T04:45:10.310 回答