如何使用反射实现回调



我在一个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方法,因为这可以确保类型安全,并避免方法调用的反射,这可能是低效的。

相关内容

  • 没有找到相关文章

最新更新