Java反射权限错误

菲利普·斯皮斯(Philipp Spiess):

我正在尝试通过URLClassLoader加载类(嗯,它都不能与普通的类加载器一起使用),并且希望它们没有任何权限。

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

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

好的,回来:我创建了一个WatchDog线程,该线程检查该线程是否花费了太多时间。

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

java.lang.RuntimePermission accessClassInPackage.sun.reflect),

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

编辑:我有时间精简示例。我发现http://myxcode.at/securitymanager.zip不要求SecurityManager同步。只需运行这段小代码,看看红线。

如果第一行中出现红线,则​​再次运行该程序,您会发现它似乎有点不受控制。

问题或多或少是我需要同步安全管理器。这是我的输出给那些无法解决错误的人(错误?)http://pastebin.com/E9yLRLif

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

杰哈:

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

线程[main,5,main]的checkPermission((java.lang.RuntimePermission accessClassInPackage.sun.reflect))

延迟权限检查的原因是以下方法所使用inflationThresholdReflectionFactory类中的invoke一个NativeMethodAccessorImpl.java

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

要禁用延迟,您可以使用Reflection API :)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档