反射代碼:
package test; public class Person { private String userName= "Tom"; private void playGame() { System.out.println(userName+ "悄悄玩兒游戲"); } }
package test; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Private { public static void main(String[] args) throws Exception { Person person = new Person(); Class c = person.getClass(); //Class c2 = Class.forName("test.Person"); //Person person2 = (Person)c2.newInstance(); Method method = c.getDeclaredMethod("playGame"); method.setAccessible(true); method.invoke(person); Field field = c.getDeclaredField("userName"); field.setAccessible(true); field.set(person,"John"); method.invoke(person); } }
輸出結果:
Tom悄悄玩兒游戲
John悄悄玩兒游戲
在這里面很關鍵的一處代碼是 setAccessible(true),這行代碼取消了java的權限控制檢查。調用了類Person的private方法,並且修改了其private成員變量的值。
private的意義是什么?
- private並不是解決安全問題的,如果想讓解決代碼的安全問題,請用別的辦法。
- private的意義是OOP(面向對象編程)的封裝概念。
而對於setAccessible()方法會破壞類的訪問規則,產生安全隱患,我在知乎上面看到的一篇回答貌似很有道理: