Для моего апплета нужны классы, которые являются частью внешних банок (подписанных банок) и родных библиотек. Я развертываю эти банки в своем апплете apple.jar. Чтобы загрузить классы из этих банок, я нашел com.jdotsoft.jarloader.JarClassLoader класс, который будет полезен. Сначала я создаю консольное приложение для проверки функциональности своего апплета, и JarClassLoader отлично работает для меня. Далее я написал класс MyApplet с двумя дополнительными общедоступными методами, скажем action1() и action2(). И, как описано JarClassLoader, я написал класс MyAppletLauncher. (см. код ниже). Чтобы получить ссылку на объект MyApplet, созданный JarClassLoader, я добавил метод getApplet() в класс JarClassLoader.Как использовать объект, созданный другим ClassLoader
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 был создан в другое пространство имен (= не тот же загрузчик классов). Но моя проблема здесь в том, как получить вызовы action1() и action2() к объекту MyApplet? Или чаще, можно ли вызвать публичный интерфейс MyApplet из объекта MyAppletLauncher?
Я уже попробовал несколько вещей, как
- MyApplet реализует MyInterface, а затем бросили в MyInterface
- Изменить тип члена JarClassLoader.applet к MyApplet
Но результат в ClassCastException в какой-то момент.
Любое предложение приветствуется. Спасибо.
Возможно, аплету необходимо принимать вызовы с Javascript? – biziclop
Это правильно biziclop, я вызываю action1() и action2() непосредственно из Javascript. –
Javascript, вызывающий методы апплета, обычно оказывается довольно беспорядочным, но да, я полагаю, это может быть то, что происходит. Я предполагаю, что другие апплеты могут делать то же самое (также беспорядок). –