繁体   English   中英

使用反射的静态方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM