Java反射权限错误

Java反射权限错误,java,reflection,classloader,securitymanager,Java,Reflection,Classloader,Securitymanager,我试图通过URLClassLoader加载一个类(好吧,它与普通的类装入器都不起作用),并且希望它们没有任何权限 因此,我创建了自己的安全管理器,它在启动时生成一个密钥,该密钥只能被请求一次(在主线程中)。 安全管理器有两个列表,applicationThread(将被授予任何权限)和temporaryList(仅被授予一次权限)(关于反射) 由于很难描述,我决定上传整个内容:看看下面的链接 好的,回来吧:我创建了一个看门狗线程,它检查线程是否花费了太多时间 当我现在开始从URLClassLoa

我试图通过URLClassLoader加载一个类(好吧,它与普通的类装入器都不起作用),并且希望它们没有任何权限

因此,我创建了自己的安全管理器,它在启动时生成一个密钥,该密钥只能被请求一次(在主线程中)。 安全管理器有两个列表,applicationThread(将被授予任何权限)和temporaryList(仅被授予一次权限)(关于反射)

由于很难描述,我决定上传整个内容:看看下面的链接

好的,回来吧:我创建了一个看门狗线程,它检查线程是否花费了太多时间

当我现在开始从URLClassLoader实例两个类时,我只调用了30个方法,没有得到任何错误,但在第31次调用时,它尝试检查以下内容的权限,但这只是在第30次调用之后发生的

java.lang.RuntimePermission accessClassInPackage.sun.reflect), java.lang.RuntimePermission accessClassInPackage.sun.reflect), 有人知道那里发生了什么吗

编辑: 我有时间把这个例子删去。 我发现SecurityManager没有被要求同步。只需运行这段代码,看看红线

如果红线出现在第一行,只需再次运行程序,您将发现它似乎有点失控

或多或少的问题是,我需要同步安全管理器。 这是我为那些无法面对错误(bug?)


编辑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);