从签名的applet加载Java类
时间:2020-03-05 18:52:41 来源:igfitidea点击:
如果我运行的是经过签名的Java小程序,是否可以从远程源(在同一域,甚至是同一主机中)加载其他类并运行它们?
我想做到这一点而无需更改页面甚至不停止当前的applet。当然,所有类的总大小太大而无法一次加载它们。
有没有办法做到这一点?有没有办法用签名的applet来做到这一点并保持其"信任"状态?
解决方案
回答
听起来应该有可能(但我从未做到)。我们是否已经看过远程方法调用(RMI)?
回答
我认为类是在Applet中延迟加载的。按需加载。
无论如何,如果这些类在jar之外,则可以简单地使用applet类加载器并按名称加载它们。前任:
ClassLoader loader = this.getClass().getClassLoader(); Class clazz = loader.loadClass("acme.AppletAddon");
如果要从jar加载类,我认为我们需要使用jar的URL创建URLClassLoader的新实例。
URL[] urls = new URL[]{new URL("http://localhost:8080/addon.jar")}; URLClassLoader loader = URLClassLoader.newInstance(urls,this.getClass().getClassLoader()); Class clazz = loader.loadClass("acme.AppletAddon");
默认情况下,禁止applet创建新的类加载器。但是,如果我们在applet上签名并包含创建新的类加载器的权限,则可以这样做。
回答
是的,我们可以打开与运行小程序的主机的URL连接。我们可以使用HTTP URL创建一个类加载器,或者将类(以jar形式)下载到用户的计算机上,并使用这些jar在类路径中创建一个类加载器。小程序不会停止,我们不需要加载其他页面。
关于信任度问题的第二部分,一旦用户授予访问applet的权限,它就可以下载任何内容,无论是什么,它都希望下载到本地计算机。如果UI设计允许,我们可能会通知用户正在执行的操作。
希望这可以帮助。