zoukankan      html  css  js  c++  java
  • 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值:
    		" + 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值:
    		" + value);
    31         } catch (Exception e) {
    32             e.printStackTrace();
    33         }
    34     }
    35 }
    View Code
    
    
    错误原因:
        无法访问私有化的构造方法,普通方法,和私有属性。

    解决方案:
    1. 将修饰类属性的 private 改为 public
    2. 调用setAccessible()方法,来设置或取消访问检查,以达到访问私有对象的目的【如修改后代码28行】

     

  • 相关阅读:
    还做开发!重新学习纪念一下先
    NOD32中小企业服务器版部署方法
    我买车了,写个总结
    Windows Server 2008 各个版本微软官方下载
    SQLServer2008过程中因性能计数器不一致导致无法安装的解决方法
    自建邮件服务器的注意事项
    01.Linux下C语言编程环境检查
    wcf部署到IIS宿主上报错
    Win7 开发WCF时 提示 进程不具有此命名空间的访问权限
    SQLServer2008设置 开启远程连接 (转)
  • 原文地址:https://www.cnblogs.com/JealousGirl/p/reflectprivate.html
Copyright © 2011-2022 走看看