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