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

Java 通过接口中的对象常量使用反射进行迭代,java,reflection,iteration,Java,Reflection,Iteration,我试图自己实现类似enum的东西。当我试图迭代我的常量对象时,我遇到了使用反射的情况,我偶然发现了。这是我的设想。我有一个实体类,用于保存一对字符串常量 public class ConstantEntity { private String constantName; private String constantDesc; ConstantEntity(String name, String desc) { this.constantName =

我试图自己实现类似enum的东西。当我试图迭代我的常量对象时,我遇到了使用反射的情况,我偶然发现了。这是我的设想。我有一个实体类,用于保存一对字符串常量

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");


}
我试图使用

import java.lang.reflect.Field;

public class ConsumeConstants {

    public static void main(String args[]) {

        Field[] fields = MyConstantsPool.class.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {

            Object myConstant = fields[i];
            ConstantEntity typeSafeEnum = (ConstantEntity) myConstant ;
            System.out.println(" The name: "
                    + ((ConstantEntity) typeSafeEnum).constantName());
            System.out.println(" The description: "
                    + ((ConstantEntity) typeSafeEnum).constantDesc());

        }
    }
}
import java.lang.reflect.Field;
公共类常量{
公共静态void main(字符串参数[]){
Field[]fields=MyConstantsPool.class.getDeclaredFields();
for(int i=0;i
我查阅了文档,但我不能理解这个领域背后的想法。我对使用反射的理解完全错误吗?我们什么时候使用字段?迭代接口中所有对象常量的正确方法是什么


注意:我使用的是java 1.4;因此,我必须使用基本的java特性来实现这一点。

使用java反射,您可以检查类的字段(成员变量),并在运行时获取/设置它们

给定一个类的实例,可以使用反射来设置 该类中字段的值。这通常仅在以下情况下完成: 以通常方式设置值时的特殊情况不适用 可能因为这种访问通常违反设计意图 对于该类别,应尽最大的谨慎使用。

因此,可以使用类对象为声明的公共、声明的受保护或声明的私有字段获取字段对象。


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

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

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
};

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

迭代接口中所有对象常量的正确方法是什么

如果要迭代所有的
静态恒定性
字段,可以使用如下方法:

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);
    }
}
Field[]fields=MyConstantsPool.class.getFields();
for(int i=0;i
我对使用反射的理解完全错误吗

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
};
从代码中的错误中,尝试将myConstant直接转换为Constantenty,至少部分转换为Constantenty。您必须调用
get
来实际检索字段中的值。
字段
对象本身只是一个访问器

你也可以看到



还有,Java1.4,真的吗???这已经过时10多年了。

你刚刚犯了一个简单的错误, 您抓取
字段
并试图将其强制转换为类的
恒定性

您需要从字段中获取值:

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

接口不能有非静态字段,因此
Modifier.isStatic(f.getModifiers()
可能是多余的(除非我误解了你的想法)。@Pshemo是的,你是对的,在这里检查修饰符或多或少是多余的。我的代码示例只是想更一般一些。@Radiodef“我查阅了文档,但无法理解Field背后的想法。我对使用反射的理解是否完全错误?我们何时使用Field?”我将问题解释为:“为什么使用反射?何时有用?目标是什么?”我错了吗?