替换为Security Manager checkMemberAccess()

时间:2018-12-17 23:27:57

标签: java securitymanager

Java安全管理器方法checkMemberAccess()的参数包含正在调用Reflection的类。不建议使用此方法,说明中说使用checkPermission()代替。 checkPermission()中没有与checkMemberAccess()中相似的参数。

在安全管理器中,如何在没有checkMemberAccess()方法的情况下获得反射目标类?

即如果A类对B类进行反思,我想知道 target 是B类。

1 个答案:

答案 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");
 }