當前需求: 利用反射獲取某一屬性值
運行結果: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 }
當前代碼:

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 }
修改后代碼:

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 }
錯誤原因:
無法訪問私有化的構造方法,普通方法,和私有屬性。
解決方案:
1. 將修飾類屬性的 private 改為 public
2. 調用setAccessible()方法,來設置或取消訪問檢查,以達到訪問私有對象的目的【如修改后代碼28行】