【发布时间】:2017-01-27 13:02:04
【问题描述】:
JLS 8 states 每个枚举类都有隐式声明的方法:
public static E[] values();
所以,按照规范,它是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);
我想知道:这是什么意思?
【问题讨论】:
-
可能与此评论相关:“当用户编造不符合枚举规范的类枚举类时,可能会发生这种情况。” grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
-
哈,很好。怎么可能“编造”这样的班级? O_o
-
在 Java 5 中引入枚举之前,创建自己的枚举等价物是一种常见做法(也是一种很好的做法):具有非公共构造函数的类和包含以下内容的公共静态常量该类的实例。例如TextAttribute、FileChannel.MapMode 和DateFormat.Field。
-
@VGR 这很有趣,但是那些类不包含
values()方法。 -
@kaqqao 类不能直接扩展
java.lang.Enum。它被编译器禁止。此外,Class.getEnumConstantsShared通过调用方法Class.isEnum可以防止非枚举类。
标签: java reflection enums