我有一个使用反射实例化保存在某个目录中的代码的应用程序:我创建了一个URLClassLoader,然后使用提供的URL加载类;这很好用。我试图将应用程序移植到Applet。为了加载文本文件和图像,我使用相对路径更改了代码以使用getResourceAsStream()
,这非常有用。但是,对于类加载器,我仍然有一个I / O异常(在我更改代码以使用流之前,我还习惯使用文本文件和图像):
java.security.AccessControlException: access denied (java.io.FilePermission /.../... read)
要加载的类包含在jar文件中(与所有其他资源一样)。有没有办法使用不调用安全异常的getResourceAsStream()
之类加载类?请注意:我在谈论从java代码中调用的类加载器,而不是加载applet的类加载器。
编辑:有关文件/文件夹结构的更多详细信息:
我的applet位于包a,.myApplet中,它使用了一个类a.aa.Loader,用于加载存储在另一个文件夹b中的类(因此在加载applet时不会加载)。文件夹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] ,等等。}和[b] = {c_1,_c2,...}其中c_i = {[x]},[x] = {[y]},[y] = {[z]},最后[z ] = {} Class.class。希望符号不是太奇怪。
Edit2:更多细节。
澄清一下:我要加载的类是其他人的类,都放在一个单独的目录“DIR”中(它们不是项目的一部分,也不是自己组成的项目)。实际上,所有这些类名都是相同的,它们存储在“DIR”中的唯一目录中。我需要一次加载一个文件。换句话说,我想像任何其他资源一样对待类文件。
注意:我尝试了一个已签名的applet,它不再引发安全性异常,而是一个IO:它无法找到该文件。我检查了目录结构并尝试了很多变种,都具有相同的结果(它适用于我的本地机器)。我不确定它是否真的是一个IO问题,或者它是否仍然是一个安全问题。
答案 0 :(得分:1)
实际上,将一个项目作为一个单独的对象区分,这是一个糟糕的基调,所以......
您可以将所有项目打包到一个jar文件中。
如果您将课程保留在服务器上仅仅是因为整体 项目太大你可以使用pack200 util压缩它 对Java Web Start胖客户端小程序非常有用
我建议使用jnlp applet启动类型,因为它提供了 其DeployJava.js
P.S。
如果你真的坚持用类加载器加载资源,那就用applet标准方式做,我的意思是用一个Anchor对象
例如创建像
这样的结构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;
}
}
Test.java
public class Test
{
SourceBound sourceBound=new SourceBound();
Test()
{
JButton button=new JButton();
button.setIcon(sourceBound.getImageA());
}
}
祝你好运