java.lang.IllegalAccessException: Class main.com.ConstantsF can not access a member of class main.co

对于这个问题,我看spring 源码时候发现有这个比较好用的类,然后自己用了一下,发现有一点坑,这里提出来,

说说现象,对于这个类的理解,就是讲一个类里面的静态变量public static Final)放入到一起

他有一下要求

1.必须是public class

2,必须在本类调用

这样可以把问题出现的概率竟可能小

说书今天我踏过坑

这个是源码

            try {
                    Object value = field.get((Object)null);
                    this.fieldCache.put(name, value);
                } catch (IllegalAccessException var9) {
                    ;
                }

应为马油打印问题,所以我复制的一份源代码

           try {
                    Object value = field.get((Object)null);
                    this.fieldCache.put(name, value);
                } catch (IllegalAccessException var9) {
                    var9.printStackTrace();
                }

把我的demo类和复制的源码的类放在一个package 下,但是就是现在出现问题,我改过的代码,可以越过以前的Constants所设置的障碍,直接可以访问,后来我把,我复制的Constants,移动其他包下,果然和spring 源码Constants出现,并且爆出了我想要的堆栈信息,后台我想了这样的一段代码

  if (!Modifier.isPublic(getClassAccessFlags(var1))) {
                var5 = isSameClassPackage(var0, var1);
                var4 = true;
                if (!var5) {
                    return false;
                }
            }

这就可以解释之前我出那个问题,他这个类会检查,你的demo是否在同在一个package下面

如果在同一个packge,他就可以直接访问你的属性,如果不在同一个package 下面,直接抛出访问异常

但是还有一个问题,那就是

class Man {
    public static final int VALIDATION_NONE = 0;
    public static final int VALIDATION_AUTO = 1;
    public static final int VALIDATION_DTD = 2;
    public static final int VALIDATION_XSD = 3;
    private ConstantsF constants = new ConstantsF(Man.class);

    public Man() {
        System.out.println(Arrays.toString(constants.getNamesForSuffix("NONE").toArray()));
    }
    public static void main(String[] args) {
        Man man = new Man();
    }
}

public class Main {
    public static void main(String[] args) throws IllegalAccessException {
    }
}

不是public class ,连自己的属性否不能访问,但是可以访问其他的public class

猜你喜欢

转载自blog.csdn.net/qq_33291307/article/details/85015021
今日推荐