java通过反射执行枚举的方法,求大神! 本帖最后由 TMZ794600991 于 2014-09-09 17:44:05 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static void main(String[] args) throws Exception { Class<?> class1 = Class .forName("learning.CommonConstants$ORDERTYPESTATE"); ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS ; Method[] methods = class1.getDeclaredMethods(); for (Method method : methods) { if(method.getName().startsWith("get")){ System.out.println(method.getName() + ": " + method.invoke(order)); } } }楼主想要的是这个吗? sky_walker85:我的实际应用场景中是通过自定义标签,传一个"ORDERTYPESTATE"来获取生成下拉框(select)的选择列表,所以是不能使用你这一步的:ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS ;,而枚举貌似没法使用Object object = class2.newInstance();这种方法,所以动态执行不了他的方法,很无助! Class<?> class2 = field.getClass();应该是Class<?> class2 = field2.getClass();吧 这个没问题啊,我那个order变量只是举例说明的,你可以根据传入的参数生成不同order对应的实例啊,比如传入DEALERORDERS 生成ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS,然后再执行method.invoke就可以了 Field[] field = class1.getFields();for(int i=0;i<field.length;i++){System.out.pfrintln(ORDERTYPESTATE.values()[i].getName());System.out.pfrintln(ORDERTYPESTATE.values()[i].getValue());}这样子可以获取到,在弄个Map存起来传到前台就OK了 这个没问题啊,我那个order变量只是举例说明的,你可以根据传入的参数生成不同order对应的实例啊,比如传入DEALERORDERS 生成ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS,然后再执行method.invoke就可以了完整代码:public class CommonConstants { /** * 流程常量 * * @author tangkun * */ public enum RESULTSTATE { HASPASS("已通过", 1), DIDNOTPASS("未通过", -1), TRANSFER("转派", 2); private final String name; private final Integer value; RESULTSTATE(String name, Integer value) { this.name = name; this.value = value; } public String getName() { return name; } public Integer getValue() { return value; } } /** * 记录状态枚举 用于UIA * * @author tangk * */ public enum RECORD_STATE { INVALID("无效 ", 0), AVAILABLE("有效", 1), ENABLE("启用", 2), DISABLE("停用", 3); private final String name; private final Integer value; RECORD_STATE(String name, Integer value) { this.name = name; this.value = value; } public String getName() { return name; } public Integer getValue() { return value; } } /** *@desc 订单类型 * @author tangkun * */ public enum ORDERTYPESTATE { HEADQUARTERSORDERS("总部订单 ", 0), DEALERORDERS("经销商订单", 1), DIRECTORDERS( "直销订单", 2); private String name; private Integer value; ORDERTYPESTATE(String name, Integer value) { this.name = name; this.value = value; } public String getName() { return name; } public Integer getValue() { return value; } } public static void main(String[] args) throws Exception { /** * 自定义标签只传值【ORDERTYPESTATE】 * key=ORDERTYPESTATE * className="com.happyLife.utils.CommonConstants$"+key * 想实现的效果:比如ORDERTYPESTATE * <option value="0">总部订单</option> * <option value="1">经销商订单</option> * <option value="2">直销订单</option> * 将其输出到jsp */ String className = "com.happyLife.utils.CommonConstants$ORDERTYPESTATE"; parseSelectHtml(className); } public static String parseSelectHtml(String className) throws Exception { String html = ""; Class<?> class1 = Class.forName(className); Field[] field = class1.getFields(); for (Field field2 : field) { field2.setAccessible(true); Class<?> class2 = field2.getClass(); Method[] methods = class2.getDeclaredMethods(); /** * methods为空, 我想动态调用枚举中的变量的值 */ for (Method method : methods) { if ("getName".equals(method.getName())) ; } //报错 Object object = class2.newInstance(); Method m = class2.getMethod("getName", null); Object valueObject = m.invoke(object, null); /********剩余拼接html的代码*****/ } return html; }}jsp使用自定义标签时候,只是传一个枚举类的名而已! 在代码中加入下面的语句,就可以获取所有枚举对象的值,然后在拼接为你想要的东西:ORDERTYPESTATE[] orders = ORDERTYPESTATE.values(); for(ORDERTYPESTATE ord : orders) System.out.println(ord.getName() + ": " + ord.getValue()); 你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型! 你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型!试试这个呢public static void main(String[] args) throws Exception { //String enumStr = "ORDERTYPESTATE"; Class<?> class1 = Class .forName("learning.CommonConstants$ORDERTYPESTATE"); Method[] methods = class1.getDeclaredMethods(); if(class1.isEnum()){ List<?> list = Arrays.asList(class1.getEnumConstants()); for(Object enu : list){ for(Method method : methods){ if(method.getName().startsWith("get")){ System.out.println(method.invoke(enu)); } } } } } 你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型!试试这个呢public static void main(String[] args) throws Exception { //String enumStr = "ORDERTYPESTATE"; Class<?> class1 = Class .forName("learning.CommonConstants$ORDERTYPESTATE"); Method[] methods = class1.getDeclaredMethods(); if(class1.isEnum()){ List<?> list = Arrays.asList(class1.getEnumConstants()); for(Object enu : list){ for(Method method : methods){ if(method.getName().startsWith("get")){ System.out.println(method.invoke(enu)); } } } } }在此跪谢,这个可以,我那天做了一个list的 反射遍历对象的操作,都没想到这这种方式,看来还不够机智,等这多天看来没白等,你很牛B,小子不错哦 java 线程设置优先级 有没有了解工作流平台osworkflow的? Jlabel 类! How to finish the java constructor throw Exception test? 请教一个简单的接口实现的问题 寻求帮助 请问谁知道有什么分析JAVA代码的工具? 数据类型的问题 现在是2004年刚开始,祝大家新年快乐! 看里面代码?? 请问生成class文件写的中文变成乱码了 java后面的数字代表什么意思
.forName("learning.CommonConstants$ORDERTYPESTATE");
ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS ;
Method[] methods = class1.getDeclaredMethods();
for (Method method : methods) {
if(method.getName().startsWith("get")){
System.out.println(method.getName() + ": " + method.invoke(order));
}
} }
楼主想要的是这个吗?
应该是
Class<?> class2 = field2.getClass();
吧
for(int i=0;i<field.length;i++){
System.out.pfrintln(ORDERTYPESTATE.values()[i].getName());
System.out.pfrintln(ORDERTYPESTATE.values()[i].getValue());
}
这样子可以获取到,在弄个Map存起来传到前台就OK了
完整代码:
public class CommonConstants { /**
* 流程常量
*
* @author tangkun
*
*/
public enum RESULTSTATE {
HASPASS("已通过", 1), DIDNOTPASS("未通过", -1), TRANSFER("转派", 2);
private final String name;
private final Integer value; RESULTSTATE(String name, Integer value) {
this.name = name;
this.value = value;
} public String getName() {
return name;
} public Integer getValue() {
return value;
}
} /**
* 记录状态枚举 用于UIA
*
* @author tangk
*
*/
public enum RECORD_STATE {
INVALID("无效 ", 0), AVAILABLE("有效", 1), ENABLE("启用", 2), DISABLE("停用", 3);
private final String name;
private final Integer value; RECORD_STATE(String name, Integer value) {
this.name = name;
this.value = value;
} public String getName() {
return name;
} public Integer getValue() {
return value;
} } /**
*@desc 订单类型
* @author tangkun
*
*/
public enum ORDERTYPESTATE {
HEADQUARTERSORDERS("总部订单 ", 0), DEALERORDERS("经销商订单", 1), DIRECTORDERS(
"直销订单", 2);
private String name;
private Integer value; ORDERTYPESTATE(String name, Integer value) {
this.name = name;
this.value = value;
} public String getName() {
return name;
} public Integer getValue() {
return value;
}
} public static void main(String[] args) throws Exception { /**
* 自定义标签只传值【ORDERTYPESTATE】
* key=ORDERTYPESTATE
* className="com.happyLife.utils.CommonConstants$"+key
* 想实现的效果:比如ORDERTYPESTATE
* <option value="0">总部订单</option>
* <option value="1">经销商订单</option>
* <option value="2">直销订单</option>
* 将其输出到jsp
*/
String className = "com.happyLife.utils.CommonConstants$ORDERTYPESTATE";
parseSelectHtml(className);
} public static String parseSelectHtml(String className) throws Exception { String html = "";
Class<?> class1 = Class.forName(className);
Field[] field = class1.getFields();
for (Field field2 : field) {
field2.setAccessible(true);
Class<?> class2 = field2.getClass();
Method[] methods = class2.getDeclaredMethods();
/**
* methods为空, 我想动态调用枚举中的变量的值
*/
for (Method method : methods) {
if ("getName".equals(method.getName()))
;
}
//报错
Object object = class2.newInstance();
Method m = class2.getMethod("getName", null);
Object valueObject = m.invoke(object, null);
/********剩余拼接html的代码*****/
}
return html;
}
}
jsp使用自定义标签时候,只是传一个枚举类的名而已!
ORDERTYPESTATE[] orders = ORDERTYPESTATE.values();
for(ORDERTYPESTATE ord : orders)
System.out.println(ord.getName() + ": " + ord.getValue());
你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型!
你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型!
试试这个呢
public static void main(String[] args) throws Exception {
//String enumStr = "ORDERTYPESTATE";
Class<?> class1 = Class
.forName("learning.CommonConstants$ORDERTYPESTATE");
Method[] methods = class1.getDeclaredMethods();
if(class1.isEnum()){
List<?> list = Arrays.asList(class1.getEnumConstants());
for(Object enu : list){
for(Method method : methods){
if(method.getName().startsWith("get")){
System.out.println(method.invoke(enu));
}
}
}
}
}
你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型!
试试这个呢
public static void main(String[] args) throws Exception {
//String enumStr = "ORDERTYPESTATE";
Class<?> class1 = Class
.forName("learning.CommonConstants$ORDERTYPESTATE");
Method[] methods = class1.getDeclaredMethods();
if(class1.isEnum()){
List<?> list = Arrays.asList(class1.getEnumConstants());
for(Object enu : list){
for(Method method : methods){
if(method.getName().startsWith("get")){
System.out.println(method.invoke(enu));
}
}
}
}
}
在此跪谢,这个可以,我那天做了一个list的 反射遍历对象的操作,都没想到这这种方式,看来还不够机智,等这多天看来没白等,你很牛B,小子不错哦