我有像 Dog.java
、Cat.java
、Bird.java
、Fish.java
这样的类,Not_Listed.java
等。我还有一个 ID.java
,它只保留一些最终的 int 映射:
public class ID{
public static final int CAT = 1;
public static final int DOG = 3; // there maybe some integers skipped
public static final int FISH = 4; // but all integers are unique
public static final int BIRD = 6;
public static final int NOT_LISTED = -1;
}
上面列出的所有类都扩展了 Animal.java
类。
我需要的是给定“6”我需要创建一个Bird
对象,给定“1”我需要创建Cat
对象。给定“2”或“5”,我可以返回一个 Not_Listed
对象或简单地抛出一个错误(两者都有效)。我可以简单地使用 switch case
或 HashMap
来完成此操作,但我的列表有点长,而且我不想在列表增长时更新代码。所以我想到了反射(reflection),但我不知道该怎么做?
也欢迎任何其他有效的解决方案。抱歉,我对反射很菜鸟。提前致谢。
编辑:ID必须
最佳答案
您不需要对此进行反射(reflection)。
创建一个枚举而不是您的 id 类,并在枚举中包含一个类引用,即:
enum Animal {
CAT(1, Cat.class),
DOG(2, Dog.class),
FISH(3, Fish.class);
private final Class clazz;
private final int id;
Animal(int id, Class clazz) {
this.id = id;
this.clazz = clazz;
}
public Object generateInstance() {
return clazz.generateInstance();
}
public class getGeneratedClass() {
return clazz;
}
public int getId() {
return id;
}
}
这利用了 Java 的功能,允许枚举成为功能齐全的类,并记录要在枚举中的每个条目中使用的 Class
。然后,只要该类具有 0 参数构造函数,您就可以使用该Class
按需生成新实例。
要使用它,只需执行以下操作:
Animal.DOG.generateInstance() // Returns a Dog object
Animal.CAT.generateInstance() // Returns a Cat object
如果您希望能够从 id 获取类型,您可以在枚举内构建一个 HashMap
来进行查找,或者只是循环 enum.values() 来查找匹配项。
关于java - 反射,创建一个给定 int 的特定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693711/