来自课程getClassLoader()
中的文档,
如果存在安全管理器,则调用者的类加载器不存在 null和调用者的类加载器与祖先不同 请求类加载器的类的类加载器, 然后此方法调用安全管理器的checkPermission方法 使用RuntimePermission(“getClassLoader”)权限来确保它的权限 好的,可以访问该类的类加载器。
getClassLoader()
何时抛出SecurityException?我认为调用者的类加载器总是与请求类加载器的类的类加载器相同。
答案 0 :(得分:1)
我认为调用者的类加载器总是与请求类加载器的类的类加载器相同。
你错了。
假设您的类是使用沙箱类加载器加载到安全沙箱中的不受信任的代码。并且您的类正在调用(例如)已由默认类加载器加载的系统类。{/ p>
在这种情况下,类加载器会有所不同,并且会有一个安全管理器,因此将进行getClassLoader()
调用以检查是否允许(不受信任的)代码获取类加载器。如果不允许,则会抛出checkPermission
。
注意:"调用者的类加载器"表示加载进行调用的类的类加载器。
例如,在此代码中:
SecurityException
"来电者"是public class Foo {
public void method(Bar bar) {
bar.getClass().getClassLoader()
}
}
,"来电者的类加载器"该method
调用是getClassLoader()
类的类加载器。将对其进行测试以查看它是否与Foo
类相同的类加载器。 (或者更准确地说是Bar
调用返回的类。)