Java 当类在扩展枚举时被检测到时,如何调用其valueOf()方法?
我在Java 当类在扩展枚举时被检测到时,如何调用其valueOf()方法?,java,hibernate,class,enums,hibernate-criteria,Java,Hibernate,Class,Enums,Hibernate Criteria,我在Java中有一个Enum: 公共枚举类型用户{ 雇员(“雇员”), 雇主(“雇主”); 私有最终字符串类型; TypeOfUser(最终字符串类型){ this.type=type; } 公共字符串getType(){ 返回类型; } } 我在Hibernate映射中使用它,所以如果我想添加过滤,我使用Criteria接口。我基于Map构建标准,此时我检测它是否继承自Enum(导致每个Enum隐式继承自Java Enum类)并调用valueOf()方法的TypeOfUser: Class
Java
中有一个Enum
:
公共枚举类型用户{
雇员(“雇员”),
雇主(“雇主”);
私有最终字符串类型;
TypeOfUser(最终字符串类型){
this.type=type;
}
公共字符串getType(){
返回类型;
}
}
我在Hibernate
映射中使用它,所以如果我想添加过滤,我使用Criteria
接口。我基于Map
构建标准,此时我检测它是否继承自Enum
(导致每个Enum
隐式继承自Java Enum类)并调用valueOf()
方法的TypeOfUser
:
Class fieldClass=element.getValue().getValue();
if(Enum.class.isAssignableFrom(fieldClass)){
标准.添加(
Restrictions.eq(element.getKey(),
TypeOfUser.valueOf(element.getValue().getKey())
);
}
但它之所以有效,是因为我在我的项目中只有一个Enum,将来还会有更多的Enum,比如Months
等等。当类被检测为Enum
时,是否有方法强制转换它,然后调用它的valueOf()
方法?比如:
Class fieldClass=element.getValue().getValue();
if(Enum.class.isAssignableFrom(fieldClass)){
标准.添加(
Restrictions.eq(element.getKey(),
((Enum.class)fieldClass).valueOf(element.getValue().getKey())
);
}
我想这样做是为了避免if-else
或switch
指令,比如:
if(fieldClass.equals(TypeOfUser.class)){
value=TypeOfUser.valueOf(键);
}
else if(fieldClass.equals(Months.class)){
值=月份。值(键);
}
因为当项目中存在许多
Enum
s时,它们的维护非常困难。是否有机会在Java
中实现这一点?提前感谢您的帮助。您正在寻找Enum.valueOf
Class<E> enumClass = ...
String name = ...
E e = Enum.valueOf(enumClass, name);
Class enumClass=。。。
字符串名=。。。
E=枚举.valueOf(枚举类,名称);
您要查找的是Enum.valueOf
Class<E> enumClass = ...
String name = ...
E e = Enum.valueOf(enumClass, name);
Class enumClass=。。。
字符串名=。。。
E=枚举.valueOf(枚举类,名称);
Enum.valueOf(fieldClass,key)
在我看来应该行。Enum.valueOf(fieldClass,key)
在我看来应该行。你到底想实现什么?为什么要使用这些反射代码?@JBNizet因为我想编写QueryRestriction
类,在那里我可以放置分页、筛选、排序等,然后调用方法,如build()
,它会返回一个条件。我认为它应该尽可能的通用,因为它应该更适合那些可以是长的
,字符串
,枚举
等等的字段,甚至是真正的类,比如会议
,它有位置
。也许我错了:)但我认为它需要通用代码。P.S.Enum.valueOf(fieldClass,key)
正在做这项工作。你到底想实现什么?为什么要使用这些反射代码?@JBNizet因为我想编写QueryRestriction
类,在那里我可以放置分页、筛选、排序等,然后调用方法,如build()
,它会返回一个条件。我认为它应该尽可能的通用,因为它应该更适合那些可以是长的
,字符串
,枚举
等等的字段,甚至是真正的类,比如会议
,它有位置
。也许我错了:)但我认为它需要通用代码。P.S.Enum.valueOf(fieldClass,key)
正在执行此任务。