【发布时间】:2014-12-11 23:06:50
【问题描述】:
我的小程序需要属于外部 jar(签名 jar)和本地库的类。我在 applet.jar 中部署这些 jar。要从这些 jar 中加载类,我发现 com.jdotsoft.jarloader.JarClassLoader 类很有用。我首先构建了一个控制台应用程序来测试我的小程序的功能,并且 JarClassLoader 对我来说很好。 接下来我用两个额外的公共方法编写了 MyApplet 类,比如说 action1() 和 action2()。而且,正如 JarClassLoader 所述,我编写了一个 MyAppletLauncher 类。 (见下面的代码)。为了获得对由 JarClassLoader 实例化的 MyApplet 对象的引用,我将 getApplet() 方法添加到 JarClassLoader 类中。
MyApplet.java:
public class MyApplet extends Applet {
public void init() { ... }
public void start() { ... }
public void stop() { ... }
public void destroy() { ... }
public String action1() {
...
}
public int action2() {
...
}
}
MyAppletLauncher.java:
public class MyAppletLauncher extends Applet {
private JarClassLoader jcl;
public void init() {
jcl = new JarClassLoader();
jcl.initApple("MyApplet", this);
}
public void start() {
jcl.startApplet();
}
public void stop() {
jcl.stopApplet();
}
public void destroy() {
jcl.destroyApplet();
}
public String action1() {
return ((MyApplet) jcl.getApplet()).action1(); // <-- ClassCastException
}
public int action2() {
return ((MyApplet) jcl.getApplet()).action2(); // <-- ClassCastException
}
}
我对 JarClassLoader.java 的更改:
public class JarClassLoader extends ClassLoader {
private Applet applet; // was JApplet
public JarClassLoader() {
this(ClassLoader.getSystemClassLoader());
}
public JarClassLoader(ClassLoader parent) {
super(parent);
...
}
public void initApplet(String sClass, final Applet appletParent) { // 2nd arg was JApplet
Class<?> clazz = loadClass(sClass);
applet = (Applet) clazz.newInstance();
...
}
public Applet getApplet() {
return applet;
}
...
在我看来,很明显 MyAppletLauncher 的实例无法将提供的 Applet 实例向下转换为 MyApplet,因为 MyApplet 实例是在不同的命名空间中创建的(= 不是由同一个类加载器创建的)。但我的问题是如何获得对 MyApplet 对象的 action1() 和 action2() 调用?或者更常见的是,我可以从 MyAppletLauncher 对象调用 MyApplet 的公共接口吗?
我已经尝试了几件事,比如
- MyApplet 实现 MyInterface,然后强制转换为 MyInterface
- 将成员 JarClassLoader.applet 的类型更改为 MyApplet
但在某些时候都会导致 ClassCastException。
欢迎提出任何建议。谢谢。
【问题讨论】:
标签: java jar applet classloader classcastexception