当前需求: 利用反射获取某一属性值
运行结果: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行】