通过接口中的Object常量使用反射进行迭代

时间:2016-04-25 17:50:38

标签: java reflection iteration

我试图自己实现枚举。当我试图迭代我的​​常数对象时,我遇到了反射,我偶然发现java.lang.reflect.Field。所以这是我的情景。我有一个实体类用于保存一对String常量

concentric

我有一个界面,我使用实体

创建常量
public class ConstantEntity {

    private String constantName;
    private String constantDesc;

    ConstantEntity(String name, String desc) {
        this.constantName = name;
        this.constantDesc = desc;
    }

    public String constantName() {
        return this.constantName;
    }

    public String constantDesc() {
        return this.constantDesc;
    }

}

我正在尝试使用

来消费和迭代这些常量
public interface MyConstantsPool { 

    public static final ConstantEntity CONSTANT_ONE = new ConstantEntity("bla1", "11");
    public static final ConstantEntity CONSTANT_TWO = new ConstantEntity("bla2", "12");
    public static final ConstantEntity CONSTANT_THREE  = new ConstantEntity("bla3", "13");


}

我浏览了文档,但我无法理解Field背后的想法。我对使用反射的理解完全错了吗?我们什么时候使用Field?什么是迭代界面中所有Object常量的正确方法?

注意:我使用的是java 1.4;所以我必须使用基本的java功能来实现它。

4 个答案:

答案 0 :(得分:1)

你刚刚犯了一个简单的错误, 您抓住Field并尝试将其投放到您的班级ConstantEntity

你需要从现场获得价值:

 Object myConstant = fields[i].get(null);

答案 1 :(得分:0)

使用Java Reflection可以检查类的字段(成员变量)并在运行时获取/设置它们。

  

给定一个类的实例,可以使用反射来设置   该类中字段的值。这通常只在   以通常方式设置值的特殊情况不是   可能。 因为此类访问通常违反了设计意图   在课堂上,应该谨慎使用。

因此,Class对象可用于获取声明的public,声明的受保护或声明的私有字段的Field对象。

但是,在您的情况下,它对您的界面的“设计意图”也很有用。

答案 2 :(得分:0)

为什么不能只使用数组而不是反射?

public static final ConstantEntity CONSTANT_ONE = new ConstantEntity("bla1", "11");
public static final ConstantEntity CONSTANT_TWO = new ConstantEntity("bla2", "12");
public static final ConstantEntity CONSTANT_THREE  = new ConstantEntity("bla3", "13");

public static final ConstantEntity[] CONSTANTS = {
    CONSTANT_ONE,
    CONSTANT_TWO,
    CONSTANT_THREE
};

答案 3 :(得分:0)

Field是一个访问器,它允许您设置和获取操作并进行检查,例如在运行时发现字段的类型或修饰符。

  

迭代界面中所有Object常量的正确方法是什么?

如果要迭代所有static ConstantEntity字段,可以使用以下内容:

Field[] fields = MyConstantsPool.class.getFields();
for (int i = 0; i < fields.length; i++) {
    Field f = fields[i];
    if ( ConstantEntity.class.isAssignableFrom(f.getType())
            && Modifier.isStatic(f.getModifiers()) ) {
        ConstantEntity constant =
            (ConstantEntity) f.get(null);
    }
}
  

我对使用反射的理解完全错了吗?

从代码中的错误中,尝试将myConstant直接转换为ConstantEntity,至少部分地。您必须调用get来实际检索字段中保存的值。 Field对象本身只是一个访问者。

您可能还会看到"What is reflection and why is it useful?"

另外,Java 1.4,真的???那已经超过10年了。