我在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) {
}
};
答案 0 :(得分:0)
Method onAction = classToLoad.getDeclaredMethod("onAction", int.class);
onAction.invoke(fragmentListClients, 1);
fragmentListClients
是哪个目标对象1
是你的actionId。您正在使用反射来获取对方法的引用并调用它。
你可能最好创建一个接口并使用继承来实现和调用你的onAction
方法,因为这会让你输入安全性并避免方法调用的反射,这可能是低效的。
答案 1 :(得分:0)
您必须使用动态代理在运行时实现接口 请仔细阅读此链接以获取更多信息。 http://coderstoolbox.net/number/