JLS 8 states每个枚举类都隐式声明了方法:
public
因此,规范是Class.getEnumConstantsShared()
。
同时 final Method values = getMethod("values");
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Void>() {
public Void run() {
values.setAccessible(true);
return null;
}
});
@SuppressWarnings("unchecked")
T[] temporaryConstants = (T[])values.invoke(null);
方法强行使其可访问:
ImageView reloadButton = (ImageView) menu.findItem(R.id.menu_reloaditem).getActionView();
reloadButton.setImageResource(R.drawable.ic_menu_reloadentry);
我想知道:感觉是什么?
答案 0 :(得分:4)
简短回答:除了公开Enums
要访问方法MyEnum.values()
,该方法需要是公共的(它始终是),而MyEnum
必须是public
(或者它必须位于同一个包中)。
可以从包Class::getEnumConstantsShared()
中的java.lang
访问该方法。因此,只要java.lang
getEnumConstantsShared()
中没有公共枚举,就无法访问它。访问权限由直接呼叫者决定,而不是由呼叫堆栈上方的某人决定。 values.invoke(null)
的直接调用方是java.lang.Class
中的代码,因此可访问性规则适用于该上下文
如果您在某个包a
public class ValueGetter {
public static Object[] getValues(Class<? extends Enum> enu) throws Exception {
Method method = enu.getMethod("values");
return (Object[]) method.invoke(null);
}
}
并尝试像一个不同的包b
public class EnumTest {
enum MyEnum {
LITERAL;
}
public static void main(String[] args) throws Exception {
System.out.println(Arrays.toString(ValueGetter.getValues(MyEnum.class)));
}
}