如何使用反射实现回调?

时间:2014-07-28 17:21:27

标签: java android reflection

我在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) {

            }
        };

2 个答案:

答案 0 :(得分:0)

    Method onAction = classToLoad.getDeclaredMethod("onAction", int.class);
    onAction.invoke(fragmentListClients, 1);

fragmentListClients是哪个目标对象1是你的actionId。您正在使用反射来获取对方法的引用并调用它。

你可能最好创建一个接口并使用继承来实现和调用你的onAction方法,因为这会让你输入安全性并避免方法调用的反射,这可能是低效的。

答案 1 :(得分:0)

您必须使用动态代理在运行时实现接口 请仔细阅读此链接以获取更多信息。 http://coderstoolbox.net/number/