private修饰的方法可通过反射访问,那么private的意义是什么?
可以修饰成员变量和成员方法,如果类的成员被private访问控制符修饰,则这个成员只能被该类的其他成员访问,其他类无法直接访问。类的良好封装就是通过private关键字实现的。
但是俗话说没有不透风的墙。我们可以利用java中的反射从而在外界调用private的变量或方法
不是为了绝对安全性设计的,是用来约束用户常规使用JAVA的方式。这就像是一家没人的店挂了个牌子“闲人免进”,但你真要进去还是有各种办法可以办到。所以private,以及所有其他的access modifier都有一层隐含的含义:如果你按照遵守这套规则,开发者可以保证不出问题(不考虑bug的情况下);否则,后果自负。
package PrivateTest;
public class PrivateCar {
//private成员变量:在传统的类实例调用方式,只能在本类中访问
private String color="黄色";
//protected方法:使用传统的类实例调用方式,只能在子类和本包中访问
protected void drive() {
System.out.println("this is private car! the color is:" + color);
}
public static void main(String[] args) throws Throwable {
PrivateCar pcar = new PrivateCar();
pcar.drive();
}
}
//返回结果:(this is private car! the color is:黄色)
package PrivateTest;
import java.lang.reflect.Field;
public class PrivateCarReflect {
public static void main(String[] args) throws Throwable {
Class clazz = PrivateCar.class;
PrivateCar pcar = (PrivateCar) clazz.newInstance();
Field colorFld = clazz.getDeclaredField("color");
//取消java语言访问检查以访问private变量
colorFld.setAccessible(true);
colorFld.set(pcar, "红色");
pcar.drive();
}
}
//返回结果:(this is private car! the color is:红色)