Phi*_*ess 5 java reflection classloader securitymanager
我正在尝试通过URLClassLoader加载一个类(好吧,它既不适用于普通的类加载器),也希望它们没有任何权限.
因此,我创建了自己的安全管理器,它在启动时创建了一个密钥,只能通过请求一次(在主线程中).安全管理器有两个列表,即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:
Thread[main,5,main] 的 checkPermission ( (java.lang.RuntimePermission accessClassInPackage.sun.reflect) )
延迟权限检查的原因是以下方法使用的inflationThreshold类:ReflectionFactoryinvokeNativeMethodAccessorImpl.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);
}
Run Code Online (Sandbox Code Playgroud)
要禁用延迟,您可以使用 Reflection API :)
Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold");
hack.setAccessible(true);
hack.set(null, 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
954 次 |
| 最近记录: |