Java反射权限错误
我试图通过URLClassLoader加载一个类(好吧,它与普通的类装入器都不起作用),并且希望它们没有任何权限 因此,我创建了自己的安全管理器,它在启动时生成一个密钥,该密钥只能被请求一次(在主线程中)。 安全管理器有两个列表,applicationThread(将被授予任何权限)和temporaryList(仅被授予一次权限)(关于反射) 由于很难描述,我决定上传整个内容:看看下面的链接 好的,回来吧:我创建了一个看门狗线程,它检查线程是否花费了太多时间 当我现在开始从URLClassLoader实例两个类时,我只调用了30个方法,没有得到任何错误,但在第31次调用时,它尝试检查以下内容的权限,但这只是在第30次调用之后发生的 java.lang.RuntimePermission accessClassInPackage.sun.reflect), java.lang.RuntimePermission accessClassInPackage.sun.reflect), 有人知道那里发生了什么吗 编辑: 我有时间把这个例子删去。 我发现SecurityManager没有被要求同步。只需运行这段代码,看看红线 如果红线出现在第一行,只需再次运行程序,您将发现它似乎有点失控 或多或少的问题是,我需要同步安全管理器。 这是我为那些无法面对错误(bug?)Java反射权限错误,java,reflection,classloader,securitymanager,Java,Reflection,Classloader,Securitymanager,我试图通过URLClassLoader加载一个类(好吧,它与普通的类装入器都不起作用),并且希望它们没有任何权限 因此,我创建了自己的安全管理器,它在启动时生成一个密钥,该密钥只能被请求一次(在主线程中)。 安全管理器有两个列表,applicationThread(将被授予任何权限)和temporaryList(仅被授予一次权限)(关于反射) 由于很难描述,我决定上传整个内容:看看下面的链接 好的,回来吧:我创建了一个看门狗线程,它检查线程是否花费了太多时间 当我现在开始从URLClassLoa
编辑2:也许是关于控制台的?可能控制台太慢了?对我来说,检查发生在
i=15
时:
线程[main,5,main]的checkPermission((java.lang.RuntimePermission accessClassInPackage.sun.reflect))
延迟权限检查的原因是ReflectionFactory
类的inflationThreshold
,该类由以下invoke
方法使用:
要禁用延迟,可以使用反射API:)
把你的问题归结为一个小的、简洁的、完整的例子,并在这里发布。我的JDK版本是1.6.0_23 btw
public Object invoke(Object obj, Object[] args)
throws IllegalArgumentException, InvocationTargetException {
if (++numInvocations > ReflectionFactory.inflationThreshold()) {
MethodAccessorImpl acc = (MethodAccessorImpl) new MethodAccessorGenerator()
.generateMethod(method.getDeclaringClass(), method
.getName(), method.getParameterTypes(),
method.getReturnType(), method
.getExceptionTypes(), method
.getModifiers());
parent.setDelegate(acc);
}
return invoke0(method, obj, args);
}
Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold");
hack.setAccessible(true);
hack.set(null, 0);