关于反射时经常使用的 AccessibleObject.isAccessible() 方法,我一直以为是被 public 修饰就返回 true,其他的就返回 false,今天调试代码时发现对 ArrayList 的无参构造函数调用 isAccessible() 返回的竟然是 false,于是查阅了相关代码,在 java.lang.reflect.AccessibleObject 类中有以下代码:
1 | /** |
根据源码可知,isAccessible() 返回的为字段 override 的值,注释表示该字段表明是否语言级别的检查被覆盖,默认为 false,并不是我之前认为的修饰符是否为 public 的含义,个人认为这个方法名具有迷惑性,因为在 Oracle 的官方文档 Controlling Access to Members of a Class 中,将修饰符称为 Access level modifiers,容易让人误解 AccessibleObject.isAccessible() 的含义。在 AccessibleObject 的文档描述中,有以下说明:
By default, a reflected object is not accessible.
比如以下测试代码,输出结果为 false:
1 | package me.tianshuang; |
但是,在 java.lang.reflect.Proxy#newProxyInstance 的方法实现中有以下代码:
1 | if (!Modifier.isPublic(cl.getModifiers())) { |
在调用 setAccessible(true) 之前进行了方法修饰符的检查,这是为什么呢?
References
Why a public constructor is not accessible via reflection - Stack Overflow