Java 通过接口中的对象常量使用反射进行迭代
我试图自己实现类似enum的东西。当我试图迭代我的常量对象时,我遇到了使用反射的情况,我偶然发现了。这是我的设想。我有一个实体类,用于保存一对字符串常量Java 通过接口中的对象常量使用反射进行迭代,java,reflection,iteration,Java,Reflection,Iteration,我试图自己实现类似enum的东西。当我试图迭代我的常量对象时,我遇到了使用反射的情况,我偶然发现了。这是我的设想。我有一个实体类,用于保存一对字符串常量 public class ConstantEntity { private String constantName; private String constantDesc; ConstantEntity(String name, String desc) { this.constantName =
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?”我将问题解释为:“为什么使用反射?何时有用?目标是什么?”我错了吗?