Java安全管理器方法checkMemberAccess()
的参数包含正在调用Reflection的类。不建议使用此方法,说明中说使用checkPermission()
代替。 checkPermission()
中没有与checkMemberAccess()
中相似的参数。
在安全管理器中,如何在没有checkMemberAccess()
方法的情况下获得反射目标类?
即如果A类对B类进行反思,我想知道 target 是B类。
答案 0 :(得分:2)
在安装默认安全管理器时,应用程序将使用默认安全策略。如果您想提供我们自己的政策,可以在以下政策文件中编写:
grant {
permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
CheckMemberAccess 具有默认策略-允许访问PUBLIC成员,以及访问与调用者具有相同类加载器的类。在所有其他情况下,此方法使用 RuntimePermission(“ accessDeclaredMembers”)权限
调用 checkPermission()对于反射操作,请使用 ReflectPermission 类和 suppressAccessChecks ,它可以禁止标准的Java访问检查-对于公共,默认(程序包)访问,受保护的成员和私有成员-由反射对象在使用时执行。
但这很危险,因为恶意代码可以访问通常不可用的信息(可能是机密)和方法。
提供了策略文件后-您可以按以下方式对其进行检查:
try {
ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
permission.checkGuard(null);
System.out.println("Permission granted");
} catch (SecurityException e) {
System.out.println("Permission denied");
}