2

我希望能够在(未签名的)小程序中生成和加载自定义类。生成它们我可以处理,但我正在与似乎不希望我加载它们的小程序 SecurityManager 作斗争。

这是一个视觉概述;如您所见,我被困在第 2 阶段:

内裤侏儒

我原本打算使用自定义类加载器。显然,这在小程序中是不允许的;ClassLoader 构造函数引发 SecurityException。

然后我考虑直接在另一个类加载器上调用ClassLoader.defineClass(String name, byte[] b, int off, int len),但该方法受到保护。

我试图通过反射使该方法可访问。我的希望并不高,但我试过了,确实也抛出了 SecurityException。

URLClassLoader似乎提供了救赎:它有一个静态工厂创建方法,不会引发任何安全异常。但是,该技术不允许对加载程序进行子类化或访问受保护的 defineClass 方法。它只接受一组 URL 对象。

因此,我尝试对URL进行子类化以覆盖其 openConnection 方法,从而以这种方式返回我的类字节,但 URL 类是最终的。

然后我尝试使用重写的 openConnection 方法创建自定义URLStreamHandler并将其传递给 URL 的构造函数。SecurityManager 对此再次表示不满。

因此,我尝试使用将返回我的自定义流处理程序的自定义工厂调用 URL.setStreamHandlerFactory。又是 SecurityManager,在抱怨,因为如果不抱怨还有什么好处呢?

所以我尝试创建一个javax.management.loading.MLet。我不知道它的用途,但它是 URLClassLoader 的子类,它允许在其构造函数中指定自定义 URLStreamHandlerFactory 并且没有提到引发安全异常,但它仍然这样做。

绝望中,我尝试使用自定义 ProxySelector 调用ProxySelector .setDefault,希望能够截获一个 URL 并以某种方式将其路由回我的小程序,但我也没有权限。

我尝试java.system.class.loader通过<param name="java_arguments" ...>标签设置属性,但它似乎不是受尊敬的属性之一。

最后,我能想到的唯一剩余方法是将我的类字节发送到远程服务器,该服务器将生成一个可以与 URLClassLoader.newInstance(URL[]) 结合使用的临时 URL。那行得通,但我真的不喜欢这个主意。随着不同类加载器的交互,它似乎会很快变得复杂,并且服务器依赖性对于我想做的事情并不实际。 显然,SecurityManager 非常乐意让您创建一个 URLClassLoader,但是当您尝试使用它时会自发地感到不安。

如果可能的话,我在普通的未签名小程序安全沙箱中执行此操作,以便体验无缝。

但大多数情况下,我只是感到困惑,因为如果不可能,那就没有意义了。如果 SecurityManager 对从任意外部 URL 加载类感到满意,它不应该介意从局部变量中的字节数组加载类。 限制仍然是荒谬的。代码仍然是内部的和沙盒的。

它对于动态代码生成和实现自定义 JAR 压缩(如 LZMA 压缩)都很有用。

帮助!

4

1 回答 1

1

..SecurityManager 再次抱怨,因为如果不抱怨还有什么好处?

它的存在是为了保护最终用户,防止你做你正在尝试的事情。

..如何加载课程?

对 Jar 签名,让用户接受数字签名的代码。

..将我的类字节发送到远程服务器,该服务器将生成一个临时 URL,我可以将其与 URLClassLoader.newInstance(URL[]) 结合使用。

沙盒小程序无法创建URLClassLoader.

于 2012-12-13T02:20:11.237 回答