我试图自己实现枚举。当我试图迭代我的常数对象时,我遇到了反射,我偶然发现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功能来实现它。
答案 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年了。