Java 为什么Android classloader允许从另一个包反射访问包私有类的公共字段?

Java 为什么Android classloader允许从另一个包反射访问包私有类的公共字段?,java,android,classloader,dexclassloader,Java,Android,Classloader,Dexclassloader,Android应用程序类加载器似乎允许反射性地获取对包私有类的公共静态字段的引用,即使是从不同的包(与前面提到的类在其中定义的包不同),而例如Sun JDK类加载器则不允许 更具体地说,给定以下类定义: package org.example.a class PackagePrivateClass { public static final Parcelable.Creator<PackagePrivateClass> CREATOR = generateCreator()

Android应用程序类加载器似乎允许反射性地获取对包私有类的
公共静态
字段的引用,即使是从不同的包(与前面提到的类在其中定义的包不同),而例如Sun JDK类加载器则不允许

更具体地说,给定以下类定义:

package org.example.a

class PackagePrivateClass {
    public static final Parcelable.Creator<PackagePrivateClass> CREATOR = generateCreator();
}
在Sun JVM上执行时,它在最后一行抛出一个
IllegalAccessException

java.lang.IllegalAccessException: Class org.example.b.TestClass can not access a member of class org.example.a.PackagePrivateClass with modifiers "public static final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
...
但是,当在Android设备(5.1棒棒糖FWIW)上运行时,它执行时不会抛出,并且
creatorFieldRef.get(null)
实际上返回对
CREATOR
字段的有效引用

我的问题是:为什么会这样?这是安卓类加载器的一个bug还是一个特性??
(或者,如果适用,我在我的示例中犯了什么错误?

似乎这是安卓运行时中的一个bug,它在以下方面得到了修复:

向方法和字段反射添加访问检查

在此提交之前,可以通过反射以不受限制的方式访问字段,甚至可以设置


访问检查是在运行时函数
ValidateFieldAccess
ValidateAccess

中实现的,提交代码看起来确实会拒绝访问不同包中非公共类的字段,但尽管提交解决了特定于ART的错误,并且从Lollipop开始就包含了(这意味着它应该只在KitKat ART上复制),我问题中的示例代码不会出现在任何Android VM、Dalvik或(最新)ART上。你说服我这可能是一个bug,尽管如此,我提交了一个,我们将看看它是否有意。谢谢。
java.lang.IllegalAccessException: Class org.example.b.TestClass can not access a member of class org.example.a.PackagePrivateClass with modifiers "public static final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
...