У меня есть файл jar, CallMe.jar, содержащий mainClass CallMe.class, который реализует интерфейс CallInterface.class.Кастинг в класс jar
Из приложения anoher я обращаюсь к CallMe.jar, затем создаю экземпляр CallMe.class (я использовал специальные классы, предназначенные для загрузки классов из файла jar, который вы можете найти там: http://www.javaworld.com/article/2077572/learn-java/java-tip-70--create-objects-from-jar-files-.html).
Вот мой код:
String jarPath = "/path/to/CallMe.jar";
String mainClass = "callme.CallMe";
JarClassLoader jarLoader = new JarClassLoader(jarPath); // Loads the jar
Class c = jarLoader.loadClass(mainClass, true); // Loads the specified class inside the jar.
Object jarObject = c.newInstance(); // Creates an instance of this mainClass CallMe
Поскольку MainClass CallMe.class реализует CallInterface.class и переопределяет метод interfaceMethod(), я хочу, чтобы вызвать этот метод литья CallInterface к моему объекту. Но для этого мне кажется, что этот класс должен быть импортирован в мое текущее приложение.
Давайте рассмотрим CallInterface может быть расположен в любой упаковке моей баночке: CallMe.jar -> any.package.CallInterface.class -> callme.CallMe.class
В моем текущем проекте приложения у меня есть CallInterface в другом пакете: appli.jarLoader.CallInterface.class
Если я предполагаю, что два класса CallInterface.class одинаковы (но, вероятно, в другом пакете), как я могу ссылаться (кастинг) на тот, который в банке?
Мой текущий код тестирования выглядит следующим образом:
if(jarObject instanceof appli.jarLoader.CallInterface) { // The CallInterface in my application
Print.str(DEBUGGING, "jarObject is instance!");
appli.jarLoader.CallInterface ci = (appli.jarLoader.CallInterface) jarObject;
ci.interfaceMethod();
}
else {
Print.str(DEBUGGING, "jarObject not instance...");
}
Условием, если не проверено. Когда я пытаюсь это сделать:
Object appliObject = new Appli(); // implements appli.jarLoader.CallInterface
if(appliObject instanceof appli.jarLoader.CallInterface) {
Print.str(DEBUGGING, "appliObject is instance!");
appli.jarLoader.CallInterface ci = (appli.jarLoader.CallInterface) appliObject;
ci.interfaceMethod();
}
else {
Print.str(DEBUGGING, "appliObject is not instance...");
}
В этом случае условие проверяется, и я могу получить доступ к методу переопределенного интерфейса.
Как я могу получить доступ к методу интерфейса в моем классе реализации в файле jar? Как я могу преуспеть в литье моего jarObject с помощью ClassInterface?
EDIT 1
Идея заключается в том, что мои приложениях знают только о ClassInterface и ничего о внедряющих классах, а это значит, что я не могу просто жёстко класса imlementing
«Если я предполагаю, что этот два класса CallInterface.class является то же (но, возможно, в другом пакете), как я могу ссылаться (бросать) ту, что находится в банке »- импортируя класс, который он находится в банке? – JamesB
Я хотел бы загрузить классы во время работы, я не знаю, можно ли его импортировать во время выполнения. – kaligne