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 }
当前代码:
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行】