gpt4 book ai didi

java - 如何使用由不同类加载器实例化的对象

转载 作者:行者123 更新时间:2023-12-01 12:25:14 27 4
gpt4 key购买 nike

我的小程序需要属于外部 jar(签名 jar)和 native 库一部分的类。我将这些 jar 部署在我的 applet.jar 中。要从这些 jar 加载类,我发现 com.jdotsoft.jarloader.JarClassLoader类变得有用。我首先构建一个控制台应用程序来测试小程序的功能,JarClassLoader 对我来说工作得很好。接下来,我编写了带有两个附加公共(public)方法的 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 的公共(public)接口(interface)吗?

我已经尝试过一些事情,比如

  • MyApplet 实现 MyInterface,然后转换为 MyInterface
  • 将成员 JarClassLoader.applet 的类型更改为 MyApplet

但所有这些都会在某个时刻导致 ClassCastException。

欢迎任何建议。谢谢。

最佳答案

我认为您忽略了启动器小程序的要点。它一方面充当 applet 容器及其系统 ClassLoader 之间的垫片,另一方面充当 JCL 加载的真实 applet 和 JCL 之间的垫片。除了小程序生命周期方法之外,启动程序小程序中不应有任何内容。

我不确定如何在您的启动器小程序上调用除生命周期方法之外的任何方法。这不可能是偶然的,所以不要再尝试这样做了。在真正的小程序类和您需要的任何帮助程序类中实现小程序的所有功能,就好像启动程序小程序不存在一样。

如果您必须让外部组件查找您的小程序并调用其上的方法,请修改 JCL 或将其子类化以提供其他填充方法,并使用与应用程序生命周期方法已使用的相同模型。

关于java - 如何使用由不同类加载器实例化的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406824/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com