我在一个jar中有这个构造函数:
public ClientListFragment(String[] values, OnActionListener onActionListener)
{
this.values = values;
this.setOnActionListener(onActionListener);
}
这是抽象类OnActionListener:的实现
public abstract class OnActionListener {
public abstract void onAction(int actonId);
}
在主项目中,创建一个此类的实例,该实例位于一个jar中:
final String libPath = Environment.getExternalStorageDirectory() + "/myapi.jar";
final File tmpDir = new File(libPath);
final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("com.api.fragment.ClientListFragment");
//In this constructor, we inform an array of String and not know how to pass the callback of the abstract class
Constructor constructor = classToLoad.getConstructor(new Class[]{String[].class});
//get a instance
Object fragmentListClients = constructor.newInstance(items);
我的问题是:如何在Java中通过反射向加载的类报告回调?即如何:
onActionListener = new OnActionListener() {
@Override
public void onAction(int actonId) {
}
};
必须使用动态代理在运行时实现接口请通过此链接了解更多信息。http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html
Method onAction = classToLoad.getDeclaredMethod("onAction", int.class);
onAction.invoke(fragmentListClients, 1);
其中fragmentListClients
是目标对象1
是您的actionId。您正在使用反射来获得对方法的引用并调用它。
您可能最好创建一个接口,并使用继承来实现和调用onAction
方法,因为这可以确保类型安全,并避免方法调用的反射,这可能是低效的。