枚举的值()方法访问级别

时间:2017-01-27 13:02:05

标签: java reflection enums

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);

我想知道:感觉是什么?

1 个答案:

答案 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)));
    }
}