5

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

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

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

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

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

java.lang.RuntimePermission 访问ClassInPackage.sun.reflect),

有谁知道那里发生了什么?

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

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

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

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

4

1 回答 1

4

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

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

延迟权限检查的原因是以下方法使用inflationThresholdReflectionFactory类中的一个:invokeNativeMethodAccessorImpl.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);
}

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

Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold");
hack.setAccessible(true);
hack.set(null, 0);
于 2011-11-02T23:18:54.117 回答