Java访问权限
下表为Java访问控制符的含义和使用情况
| 同一类 | 同一包中的类 | 子类 | 其他包中的类 | |
|---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ✖️ |
default | ✔️ | ✔️ | ✖️ | ✖️ |
private | ✔️ | ✖️ | ✖️ | ✖️ |
public > protected > 同包(default) > private
‼️ Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员或方法的。
利用反射调用私有方法、访问私有属性
利用反射,首先是Class对象的获取,之后是Method和Field对象的获取。getMethod()方法返回的是public的Method对象,
而getDeclaredMethod()返回的Method对象可以是非public的。Field的方法同理。
访问私有属性和方法,在使用前要通过AccessibleObject类(Constructor、 Field和Method类的基类)中的setAccessible()方法来抑制Java访问权限的检查。
实例:调用私有方法
1 | public class PrivateClass |
1 | import java.lang.reflect.Method; |
实例:访问私有属性
1 | public class PrivateClass2 |
1 | import java.lang.reflect.Field; |

