java-调用通用枚举的getter

我需要调用字段访问器方法,即通用枚举的getter,但无法弄清楚如何调用这些方法,或更具体地说,如何将通用枚举作为传递方法的参数.

在此先感谢您的帮助.

这就是我想或多或少要做的事情.

public void(Class<? extends Enum<?>> enumType) {
    Enum<?>[] enumConstants = enumType.getEnumConstants();
    String[] text = new String[enumConstants.length];
    String[] names =  new String[enumConstants.length];
    for (int i = 0; i < enumConstants.length; i++ ) {
        Method[] methods = enumConstants[i].getClass().getDeclaredMethods();
        for (Method m: enumConstants[i].getClass().getDeclaredMethods()) {
            System.out.println(enumConstants[i].name() + ": " + m.getName() + "()");
            try {
                if (GET_KEY_METHOD_NAME.equalsIgnoreCase(m.getName())) {
                    Object value = m.invoke(I HAVE NO IDEA WHAT TO PUT HERE, "");
                    System.out.println(value.toString());
                }
                if (GET_VALUE_METHOD_NAME.equalsIgnoreCase(m.getName())) {
                    Object value = m.invoke(I HAVE NO IDEA WHAT TO PUT HERE, "");
                    System.out.println(value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

        }
    }

}

解决方法:

Method.invoke方法的参数始终是调用该方法的实例,后跟参数列表.

Object value = m.invoke(enumConstants[i]);

是您最需要的.

另外,您应该在方法中添加类型参数:

public <T extends Enum<T>> void myMethod(Class<T> enumType) {
    T[] enumConstants = enumType.getEnumConstants();

顺便说一句:您是否考虑过使用包含这些方法的接口?这将使您无需使用反射即可访问方法.

还请看一下getDeclaredMethod方法,并请记住,枚举常量可能是枚举类的子类的实例,因此您应该使用不包含Declared的方法.还要查找枚举类的方法,而不是单个类的方法,以减少查找:

例如,考虑以下内容:

public enum MyEnum implements M1M2Interface {
    ONE() {

        @Override
        public String m1(String s) {
            return "1";
        }

    }, TWO() {

        @Override
        public int m2(BigInteger i) {
            return 2;
        }

    }
    ;

}

public interface M1M2Interface {
    default String m1(String s) {
        return "2";
    }

    default int m2(BigInteger i) {
        return 1;
    }
}
public static <T extends Enum<T>> void testEnum(Class<T> enumType) throws NoSuchMethodException {
    T[] enumConstants = enumType.getEnumConstants();
    Method m1 = enumType.getMethod("m1", String.class);
    Method m2 = enumType.getMethod("m2", BigInteger.class);

    for (int i = 0; i < enumConstants.length; i++) {
        System.out.println(enumConstants[i].name() + ":");
        try {
            System.out.println("    m1:" + m1.invoke(enumConstants[i], "Hello World"));
            System.out.println("    m2:" + m2.invoke(enumConstants[i], (BigInteger) null));
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            ex.printStackTrace();
        }
    }
}

getDeclaredMethod不会在这里工作,因为这些方法可以申报/实施方:

>接口(仅在Java 8之前声明)
>枚举类
>的枚举常量(如果在“更上一层楼”不能使用EnumName.CONSTANT_NAME.methodName(),所以它不可能做访问的方法……没有声明)

上一篇:C#中的死锁情况(一)


下一篇:c#-什么时候需要在GUI对象上调用?