使用dexloader从动态加载的jar文件实现接口

时间:2015-12-29 06:37:50

标签: android

我正在开发一个项目,我必须在运行时从SD卡加载一个jar文件。我已经使用public class Dog { [Key] public int DogID { get; set; } public string DogName { get; set; } public int? DogSireID { get; set; } [ForeignKey("DogSireID")] public virtual Dog DogSire { get; set; } public int? DogDamID { get; set; } [ForeignKey("DogDamID")] public virtual Dog DogDam { get; set; } [InverseProperty("DogSire")] public virtual ICollection<Dog> DogsSires { get; set; } [InverseProperty("DogDam")] public virtual ICollection<Dog> DogsDams { get; set; } } 类成功实现了这个功能,并且我能够调用任何有或没有的函数jar文件中类的参数。

现在我面临的挑战是我必须在jar文件中实现一个接口,用于我项目中的回调。到目前为止,我无法找到任何解决方案。

我用这种方式调用方法:

dexloader

其中classLoad是从jar文件动态加载的类的实例。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分: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; 
  }
}