2014-08-01 2 views
1

У меня есть файл 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

+0

«Если я предполагаю, что этот два класса CallInterface.class является то же (но, возможно, в другом пакете), как я могу ссылаться (бросать) ту, что находится в банке »- импортируя класс, который он находится в банке? – JamesB

+0

Я хотел бы загрузить классы во время работы, я не знаю, можно ли его импортировать во время выполнения. – kaligne

ответ

1

если ваш загруженный jarObject реализует any.package.CallInterface, Я предполагаю, что для этого объекта appli.jarLoader.CallInterface приведет к исключению исключения выполнения во время выполнения.

Если вы хотите передать объект в интерфейс, упакованный в банку, вам придется добавить его также в свой проект.

Если вы уверены подписи (имя + СписокАргументы) методы вы хотите позвонить вы можете использовать отражение для вызова вашего метода:

Method m=jarObject.getClass().getMethod("methodName",Class<?>...); 
m.invoke(jarObject, ...); 
Смежные вопросы