private修飾的方法可以通過反射訪問,那么private的意義是什么?


反射代碼:

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的意義是什么?

  1. private並不是解決安全問題的,如果想讓解決代碼的安全問題,請用別的辦法。
  2. private的意義是OOP(面向對象編程)的封裝概念。

而對於setAccessible()方法會破壞類的訪問規則,產生安全隱患,我在知乎上面看到的一篇回答貌似很有道理:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM