使用反射的静态方法

时间:2012-09-20 03:37:52

标签: java reflection static

我目前正在尝试反思,最近我遇到了一个问题。我有这个方法,它计算一个只包含原始类型字段(不包括布尔值)的类的大小(单位:字节),如下所示:

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%确定是否可能有一点调整来处理这个问题。

2 个答案:

答案 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()。否则,使用反射来获取构造函数列表并调用正确的构造函数。