Java安全管理器方法 checkMemberAccess() 的参数包含正在调用Reflection的类。不推荐使用此方法,其描述为改为使用checkPermission()checkPermission()中没有类似于checkMemberAccess()中的参数。

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

即如果A类对B类进行反射,我想知道目标是B类。

最佳答案

当您安装默认的安全管理器时,应用程序将使用默认的安全策略。如果您想提供我们自己的政策,可以在以下政策文件中编写:

grant {
   permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
   permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

CheckMemberAccess具有默认策略-允许访问PUBLIC成员,以及访问与调用者具有相同类加载器的类。在所有其他情况下,此方法使用RuntimePermission(“accessDeclaredMembers”)权限调用checkPermission()

对于反射操作,请使用ReflectPermission类和preventAccessChecks,该类允许禁止标准的Java访问检查-对于公共(public),默认(程序包)访问, protected 成员和私有(private)成员-由反射对象在使用时执行。

但这很危险,因为恶意代码可以访问通常不可用的信息(可能是 secret 信息)和方法。

提供策略文件后,您可以按以下方式对其进行检查:
 try {
   ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
   permission.checkGuard(null);
   System.out.println("Permission granted");
 } catch (SecurityException e) {
   System.out.println("Permission denied");
 }

10-07 23:11