gpt4 book ai didi

java - 为什么 Android 类加载器允许从另一个包反射访问包私有(private)类的公共(public)字段?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:50 27 4
gpt4 key购买 nike

Android 应用程序类加载器似乎允许从不同的包(不同于上述类在),而 Sun JDK 类加载器则没有。

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

package org.example.a

class PackagePrivateClass {
public static final Parcelable.Creator<PackagePrivateClass> CREATOR = generateCreator();
}

并将以下代码放在单独的包中:

package org.example.b

public class TestClass {
public void testMethod() {
final Class classRef = Class.forName("org.example.a.PackagePrivateClass");
final Field creatorFieldRef = classRef.getField("CREATOR");
creatorFieldRef.get(null); // throws here (unless on Android)
}
}

在 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 Lollipop FWIW) 上运行时,它会在不抛出的情况下执行,并且 creatorFieldRef.get(null) 实际上会返回对 CREATOR 字段的有效引用.

我的问题是:为什么会这样?它是 Android 类加载器的错误还是功能??(或者,如果适用,我在示例中犯了什么错误?)

最佳答案

似乎这是 android 运行时中的一个错误,已在此 commit 中修复:

Add access checks to Method and Field reflection.

在此提交之前,可以不受限制地通过反射访问字段,甚至可以设置 the value of final fields .

访问检查是now在运行时函数 ValidateFieldAccessValidateAccess 中实现。

关于java - 为什么 Android 类加载器允许从另一个包反射访问包私有(private)类的公共(public)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060444/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com