gpt4 book ai didi

Java反射权限错误

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:14 25 4
gpt4 key购买 nike

我正在尝试通过 URLClassLoader 加载一个类(嗯,它既不能与普通类加载器一起工作),又希望它们没有任何权限。

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

因为很难描述,所以我决定上传整个东西:看看下面的链接

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

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

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

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

编辑:我有时间去掉这个例子。 http://myxcode.at/securitymanager.zip我发现,SecurityManager 没有被同步询问。只需运行这一小段代码并查看红线即可。

如果红线出现在第一行,再运行一下程序,你会发现好像有点失控了。

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

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

最佳答案

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

checkPermission ( (java.lang.RuntimePermission accessClassInPackage.sun.reflect) ) for Thread[main,5,main]

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

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

关于Java反射权限错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com