为什么公共构造函数不能通过反射访问

Ami*_*deh 4 java reflection class-visibility

执行以下代码时我很困惑:

@Test
public void testAccessible() throws NoSuchMethodException {
    Constructor<LinkedList> constructor = LinkedList.class.getConstructor();
    Assert.assertTrue(constructor.isAccessible());
}
Run Code Online (Sandbox Code Playgroud)

断言失败,但LinkedList类有public默认构造函数.那么为什么isAccessible()返回false?

Mad*_*mer 6

来自Java Docs ......

值false表示反射对象应强制执行Java语言访问检查

isAccessible 更多的是与Java的安全管理器有关,然后它与它的公共可见性有关

Class#getConstructor(Class...)并且Class#getConstructors两者都只返回public构造函数

  • YESS!我每天都学到新东西!已经过了午夜,我可以在积极的笔记上结束这一天:-) (2认同)

D3V*_*D3V 5

您可以使用getModifiers()方法来确定可访问性/修饰符,isAccessible()存在用于不同目的.

浏览Modifiersjava中的类文档.[ Link]它具有确定类成员可见性所必需的方法.

isAccessible允许反射API在运行时访问任何成员.通过调用Field.setAcessible(true)您关闭此特定Field实例的访问检查,仅用于反射.现在您可以访问它,即使它是私有,受保护或包范围,即使调用者不属于这些范围.您仍然无法使用普通代码访问该字段.编译器不允许它.