我需要调用字段访问器方法,即通用枚举的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(),所以它不可能做访问的方法……没有声明)