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行】

 

posted @ 2018-11-27 16:34  爱吃醋的兔子  阅读(9992)  评论(0编辑  收藏  举报