Java反射权限错误



我试图通过URLClassLoader加载一个类(好吧,它既不与正常的类加载器一起工作),并希望他们没有任何权限。

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

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

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

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

<>之前java.lang.RuntimePermission accessClassInPackage.sun.reflect),之前

有人知道那里发生了什么吗?

编辑:我有时间对这个例子进行简化。http://myxcode.at/securitymanager.zip我发现,SecurityManager没有被要求同步。只需运行这一小段代码,看看这些红线。

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

问题或多或少是,我需要安全管理器同步。以下是我为那些无法面对错误(bug?)的人提供的输出。http://pastebin.com/E9yLRLif

也许是关于控制台的?也许控制台太慢了?

对于我来说,检查发生在i=15:

checkPermission ((java.lang.)

运行时权限accessClassInPackage.sun.reflect))

权限检查延迟的原因是NativeMethodAccessorImpl.javainvoke方法使用的ReflectionFactory类的inflationThreshold:

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

要禁用延迟,可以使用反射API:)

Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold");
hack.setAccessible(true);
hack.set(null, 0);

相关内容

  • 没有找到相关文章

最新更新