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

     

  • 相关阅读:
    java adsl 自动拔号!
    IoC 原理
    JAVA lucene 高并发问题
    C# java通信之webservice cxf Sping
    jquery插件学习(六)
    jquery插件学习(三)
    jquery实战定宽
    jquery插件学习(五)
    jquery插件学习(四)
    Androidsqlite数据库存取图片信息
  • 原文地址:https://www.cnblogs.com/JealousGirl/p/reflectprivate.html
Copyright © 2011-2022 走看看