更换安全管理器checkMemberAccess()

Str*_*tly 8 java securitymanager

Java安全管理器方法checkMemberAccess()有一个参数,其中包含要调用Reflection的类.不推荐使用此方法,checkPermission()而是使用说明来代替使用.没有任何参数checkPermission()类似于中的参数checkMemberAccess().

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

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

Tom*_*ada 2

当您安装默认安全管理器时,应用程序将使用默认安全策略。如果您想提供我们自己的策略,您可以在策略文件中执行此操作,如下所示:

grant {
   permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
   permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
Run Code Online (Sandbox Code Playgroud)

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");
 }
Run Code Online (Sandbox Code Playgroud)