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