本帖最后由 TMZ794600991 于 2014-09-09 17:44:05 编辑

解决方案 »

  1.   

    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));
    }
    } }
    楼主想要的是这个吗?
      

  2.   

    sky_walker85:我的实际应用场景中是通过自定义标签,传一个"ORDERTYPESTATE"来获取生成下拉框(select)的选择列表,所以是不能使用你这一步的:ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS ;,而枚举貌似没法使用Object object = class2.newInstance();这种方法,所以动态执行不了他的方法,很无助!
      

  3.   

    Class<?> class2 = field.getClass();
    应该是
    Class<?> class2 = field2.getClass();
      

  4.   

    这个没问题啊,我那个order变量只是举例说明的,你可以根据传入的参数生成不同order对应的实例啊,比如传入DEALERORDERS 生成ORDERTYPESTATE order = ORDERTYPESTATE.DEALERORDERS,然后再执行method.invoke就可以了
      

  5.   

    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了
      

  6.   

    这个没问题啊,我那个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使用自定义标签时候,只是传一个枚举类的名而已!
      

  7.   

    在代码中加入下面的语句,就可以获取所有枚举对象的值,然后在拼接为你想要的东西:
    ORDERTYPESTATE[] orders = ORDERTYPESTATE.values();
    for(ORDERTYPESTATE ord : orders)
    System.out.println(ord.getName() + ": " + ord.getValue());
      

  8.   


    你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?ORDERTYPESTATE还是RECORD_STATE?ORDERTYPESTATE类型!
      

  9.   


    你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?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));
    }
    }
    }
    }

    }
      

  10.   


    你应该还没明白我意思,或许我说的不够明白,就是我在去取值拼接的时候,我只知道是枚举的名字,是个字符串而已,根本不知道枚举是什么类型,只是根据包名+枚举名来反射获取,所以根本不能确定是?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,小子不错哦