我有一个应用程序,它使用反射来实例化保存在某个目录中的代码:我创建一个 URLClassLoader,然后使用提供的 URL 加载类;这很好用。我尝试将应用程序移植到Applet。为了加载文本文件和图像,我将代码从使用相对路径更改为使用 getResourceAsStream() ,效果很好。然而,对于类加载器,我仍然有一个 I/O 异常(在我更改代码以使用流之前,我也用它来获取文本文件和图像):
java.security.AccessControlException: access denied (java.io.FilePermission /.../... read)
要加载的类包含在 jar 文件中(所有其他资源也是如此)。有没有什么方法可以使用诸如 getResourceAsStream() 之类的方法来加载类,并且不会调用安全异常?请注意:我说的是从 java 代码中调用的类加载器,而不是加载 applet 的类加载器。
编辑:有关文件/文件夹结构的更多详细信息:
我的小程序位于包a,a.MyApplet中,它使用类a.aa.Loader,该类旨在加载存储在另一个文件夹b中的类(因此在加载小程序时不会加载)。文件夹b包含许多目录b.c_i,其中c_i是唯一的目录。每个目录中都有属于包 x.y.z 的类,因此 b 的整体文件夹结构为 b.c_i.x.y.z; z 包含要加载的文件。当我创建 jar 时,顶层看起来如下([] 表示文件夹): [a],[b],[data],[images] 其中 [a]={MyApplet,[aa],[aaa],etc.} 和 [b]={c_1,_c2,...} 其中 c_i={[x]}, [x]={[y]}, [y]={[z]} 和最后 [z]={Class.class}。希望这个符号不会太奇怪。
编辑2:更多详细信息。
澄清一下:我想要加载的类是其他人的类,全部放在单独的目录“DIR”中(它们不是项目的一部分,也不构成项目本身)。事实上,所有这些类名都是相同的,它们存储在“DIR”内的唯一目录中。我需要一次加载一个文件。换句话说,我想像对待任何其他资源一样对待类文件。
注意:我尝试了一个签名的小程序,它不再抛出安全异常,而是抛出 IO 异常:它无法找到该文件。我检查了目录结构并尝试了多种变体,所有变体都具有相同的结果(它在我的本地计算机上运行)。我不确定这是否真的是一个IO问题或者是否仍然是一个安全问题。
最佳答案
实际上,将项目保留为单独的对象范围是一个不好的基调,所以...
您可以将所有项目打包到一个 jar 文件中。
如果您将类(class)保留在服务器上只是因为整个 项目太大,您可以使用 pack200 util 压缩它,即 对于 Java Web Start 胖客户端小程序非常有帮助
我确实建议使用 jnlp applet 启动类型,因为它提供了 更多选项 DeployJava.js
附注
如果您确实坚持使用类加载器加载资源,请以小程序标准方式进行,我的意思是使用 Anchor 对象
例如创建类似的结构
- |- 包图片 -
- |imageA.png
- |imageB.png
- |Anchor.class
- |SourceBound.class
SourceBound.java
public class SourceBound
{
/**
Conception only...
**/
public SourceBound(){}
public ImageIcon getImageA()
{
ImageIcon icon;
Image image;
image=ImageIO.read(Anchor.class.getResourceAsStream("imageA.png"));
icon=new ImageIcon(image);
return icon;
}
}
<小时/>
- |打包测试
- |测试.class
测试.java
public class Test
{
SourceBound sourceBound=new SourceBound();
Test()
{
JButton button=new JButton();
button.setIcon(sourceBound.getImageA());
}
}
祝你好运
关于java - Applet 中的类加载器 : Can't access files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7484321/