java.lang.IllegalAccessException: Class XX can not access a member of class XXX with modifiers "private static"


當前需求: 利用反射獲取某一屬性值
運行結果:java.lang.IllegalAccessException: Class com.example.demo.test.Reflect can not access a member of
class com.example.demo.test.EvalNum with modifiers "private static"...
反射用到的Bean類:
 1 package com.example.demo.test;  2 
 3 import java.io.Serializable;  4 
 5 /**
 6  * @description: 反射用到的類  7  * @author: The Queen Of Rabbit  8  * @date: 2018/11/26  9  */
10 public class EvalNum implements Serializable { 11 
12     private static String value; 13 
14     public EvalNum() { 15         super(); 16  } 17 
18     public static String getValue() { 19         return value; 20  } 21 
22     public static void setValue(String value) { 23         EvalNum.value = value; 24  } 25 
26 }
View Code
 
        
當前代碼:
 1 package com.example.demo.test;  2 
 3 import java.lang.reflect.Field;  4 import java.lang.reflect.Method;  5 
 6 /**
 7  * @description: Reflect Demo  8  * @author: The Queen Of Rabbit  9  * @date: 2018/11/26 10  */
11 public class Reflect { 12 
13     public static void main(String[] args) { 14         try { 15             // 通過反射獲取類信息
16             String path = "com.example.demo.test.EvalNum"; 17             Class<?> reflectClass = Class.forName(path); 18 
19             // 通過反射調用普通方法
20             EvalNum evalNum = (EvalNum) reflectClass.newInstance(); 21             Method proMethod = reflectClass.getDeclaredMethod("setValue", String.class); 22             // 把對象evalNum的pro設置為屬性(僅用於static修飾的屬性)
23             proMethod.invoke(evalNum, "屬性"); 24 
25             // 獲取pro值
26             Field field = reflectClass.getDeclaredField("value"); 27            
28             String value = (String) field.get(reflectClass.newInstance()); 29             System.out.println("獲取value值:\n\t\t" + value); 30         } catch (Exception e) { 31  e.printStackTrace(); 32  } 33  } 34 }
View Code

修改后代碼:
 1 package com.example.demo.test;  2 
 3 import java.lang.reflect.Field;  4 import java.lang.reflect.Method;  5 
 6 /**
 7  * @description: Reflect Demo  8  * @author: The Queen Of Rabbit  9  * @date: 2018/11/26 10  */
11 public class Reflect { 12 
13     public static void main(String[] args) { 14         try { 15             // 通過反射獲取類信息
16             String path = "com.example.demo.test.EvalNum"; 17             Class<?> reflectClass = Class.forName(path); 18 
19             // 通過反射調用普通方法
20             EvalNum evalNum = (EvalNum) reflectClass.newInstance(); 21             Method proMethod = reflectClass.getDeclaredMethod("setValue", String.class); 22             // 把對象evalNum的pro設置為屬性(僅用於static修飾的屬性)
23             proMethod.invoke(evalNum, "屬性"); 24 
25             // 獲取pro值
26             Field field = reflectClass.getDeclaredField("value"); 27             // 僅在獲取用private修飾屬性使用
28             field.setAccessible(true); 29             String value = (String) field.get(reflectClass.newInstance()); 30             System.out.println("獲取value值:\n\t\t" + value); 31         } catch (Exception e) { 32  e.printStackTrace(); 33  } 34  } 35 }
View Code
 
        
錯誤原因:
    無法訪問私有化的構造方法,普通方法,和私有屬性。

解決方案:
1. 將修飾類屬性的 private 改為 public
2. 調用setAccessible()方法,來設置或取消訪問檢查,以達到訪問私有對象的目的【如修改后代碼28行】

 


免責聲明!

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



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