2015-12-29 1 views
1

Я работаю над проектом, в котором я должен загружать файл jar с SD-карты во время выполнения. Я успешно достиг этого, используя класс dexloader, а также я могу вызывать любую функцию с или без аргументов класса в файле jar.Реализация интерфейса из динамически загружаемого файла jar с использованием dexloader

Теперь проблема, с которой я сталкиваюсь, заключается в том, что я должен реализовать интерфейс, который присутствует в файле jar для обратных вызовов в моем проекте. Я не могу найти какое-либо решение для достижения этого до сих пор.

Я вызов метода так:

final Class[] args = new Class[1]; 
    args[0] = Context.class; 
    final Method doSomething = classToLoad.getMethod("doSomething", args); 
    final Object myInstance = classToLoad.newInstance(); 
    doSomething.invoke(myInstance, this); 

где classLoad является экземпляром класса динамически загружается из файла JAR.

Любая помощь будет оценена. Спасибо заранее.

ответ

0

Используйте Proxy.newProxyInstance() для создания прокси-объекта, который будет реализовывать данный интерфейс (-ы). Вызовы методов интерфейса обрабатываются вашим InvocationHandler. Пример: Ваш интерфейс загружается динамически:

public interface SomeInterface { 
    void doSomething(Context context); 
} 

Создать объект, реализующий SomeInterface

Class[] ia = new Class[1]; 
ia[0] = Class.forName("SomeInterface"); 
handler = new MyHandler(); 
Object obj = Proxy.newProxyInstance(context.getClassLoader(),ia,handler) 

класса MyHandler будет обрабатывать вызовы методов SomeInterface:

class MyHandler implements InvocationHandler { 
    public Object invoke (Object proxy, Method method, Object[] args) { 
     if(method.getName().equals("doSomething")) { 
     Context context = (Context)args[0]; 
     // do something here 
     } 
     return null; 
    } 
} 
+0

Спасибо за ответы. Его не понятно. Как вы получите доступ к этому интерфейсу .. ?? и он вернет обратный вызов проекту. –

+0

newProxyInstance() возвращает объект, который реализует требуемый интерфейс. Когда на этот объект вызывается метод интерфейса, вызов пересылается в экземпляр InvocationHandler, заданный newProxyInstance(). – Rediska

+0

См. Мой отредактированный вопрос. Я добавил часть своего кода. Можете ли вы помочь, как и где реализовать свое решение ... :) Спасибо заранее –

Смежные вопросы