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