java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "private"
错误如上
在如下代码
Field[] flds = M.getClass().getDeclaredFields();
                if(flds != null){
                 for(int m = 0; m < flds.length; m++){
                 Field fieldCase = flds[m];
                 fieldCase.getName();
                 if(fieldCase.getType().getName().equals("java.lang.String") && fieldCase.get(args[i]) != null && fieldCase.getModifiers() == Member.PUBLIC){
                 fieldCase.setAccessible(true);
                 fieldCase.set(args[i],
                 (fieldCase.get(args[i]).toString()).Trim());
                
                 }
                 }
                }(fieldCase.get(args[i]).toString()).Trim()这里是我要进行的操作,暂时用trim替代问题可能是我取得的M 对象在定义的时候是定义成private的,反射接触不多,麻烦大家详细解释一下如何处理才能允许我在这里可以编辑,M的Fields  。谢谢

解决方案 »

  1.   

    补充:   我定义的M实际上是public的
      

  2.   

    我的条件里还有这样一条
    && fieldCase.getModifiers() == Member.PUBLIC
    应该过滤掉private的成员了
      

  3.   

    我来把条件分一下行
    if(fieldCase.getType().getName().equals("java.lang.String")
     && fieldCase.get(args[i]) != null
     && fieldCase.getModifiers() == Member.PUBLIC){
      

  4.   

     fieldCase.getModifiers() == Member.PUBLIC)  把这个条件放在第一位置试试  先过滤掉再 去做其他的  谢谢!
      

  5.   

    让你谢的我一头冷汗经调试异常时在set()的时候报的,跟这个位置没啥关系的 谢谢谢谢
      

  6.   

    楼主的意思是将private类型的字段动态地改成public?反射没有这种修改能力吧?
    建议用代理模式来做。
      

  7.   

    fieldCase.setAccessible(true);去掉看看
      

  8.   


    我这段代码就是嵌套在  代理里面的 ,是phprpc 服务器端 调用的时候, 
    我想在调用方法之前 把参数  处理一下 
      

  9.   

    (fieldCase.getModifiers() & Modifier.PUBLIC) == 1
    改成这样判断是否public看看
      

  10.   

    你用的是Member.public 这个值是0,应该用Modifier.PUBLIC来判断是否是public
      

  11.   

     你SET 之前先看下 是否已经过滤掉了啊 然后你那个arg[i]的东西 给输出来 LOOK 下 把值都拿出来看下 哪里不对改哪里
      

  12.   

    哦,理解楼主的意思了,我似乎发现了点问题:
    1、Field[] flds = M.getClass().getDeclaredFields();这句不报错吗?且与下面的定义能看出有什么不同?
    Field[] flds1 = M.class.getClass().getDeclaredFields();
    Field[] flds2 = this.getClass().getDeclaredFields();
    注意flds、flds1、flds2三个数组中的值是不同的,不信可以测一下(这涉及运行方法的修饰符类型)。2、getModifiers()的值:
    1).Member.PUBLIC和Member.DECLARED有什么不同?
    2).
    public int max=100;
    public static int min=0;
    max的getModifiers()和min和getModifiers()值相等吗?把这些问题弄清了,问题就迎刃而解。
      

  13.   

    1.可能你调用的那个方法不能访问私有变量,还有个方法可以访问所有变量的,你去找找看。2.flds、flds1、flds2三个数组中的值是不同的,而且Member.PUBLIC和Member.DECLARED得值是不等的,public int max=100;public static int min=0; max的getModifiers()和min和getModifiers也是不等的。
      

  14.   

    Java 反射出错时我们常碰到 2 种情况。可能性,代理之类的类的类名打印出来看看一下,如果是类似 CGLib 这种代理直接继承的话,反射是正常的,而用 Proxy 这种代理不知道是不是相同,这个我没接触过,可以去用 Spring 的带 interface 支持的 AOP 测试一下。另外一种情况:当我们的一个类有内部类做委托时也可能出现错,而这时它说的 类 B 其实不是你当时所说的 M 类,而是一个某个内部类,报错时不一定是说 field / method 是私有的而是说那个内部类是私有的,这时外部类是不能反射访问的。
      

  15.   

    多谢帮忙
    1.运行方法的修饰符问题能不能给详细讲讲,另外 M.class 这个直接编译就不通过的啊
    2.Modifier我查了资料,一个field应该可以有多个修饰符,
    这里改成  Modifier.isPublic(fieldCase.getModifiers())应该就可以了吧
      

  16.   

    多谢


    1.我还是没找到有那样的方法
    2.这个 我用Modifier.isPublic(fieldCase.getModifiers())来替代了原来错误的代码了

      

  17.   

    多谢您的回复,其实 你说的这些我又点看不懂。   狂汗 
    代理应该是java的动态代理 proxy的,用spring 的带interface测试一下?测试什么呢
    这里没有用到内部类