对继承方法使用反射的正确方法



我在我的应用程序中使用了Google Music应用程序中的touchininterceptor类。该类允许您将列表项拖放到列表中的不同位置。

touchininterceptor类调用一个名为smoothScrollBy的方法。此方法仅在API 8+中可用。

我希望我的应用程序在API 7+,所以我需要使用反射来执行smoothScrollBy只有当它存在。

在touchininterceptor的构造函数中,我添加了以下内容:

    Method[] ms = this.getClass().getDeclaredMethods();
    if (ms != null) {
        for (Method m : ms) {
            if (m != null && m.toGenericString().equals("smoothScrollBy")) {
                Class[] parameters = m.getParameterTypes();
                if (parameters != null && parameters.length == 1 && parameters[0].getName().equals("int")) {
                    mSmoothScrollBy = m;
                }
            }
        }
    }

这应该找到smoothScrollBy方法,并将其分配给touchininterceptor的一个名为mSmoothScrollBy (method)的新成员变量。

我在Android 2.2 (API 8)模拟器上调试,不幸的是,该方法从未找到。我的猜测是getDeclaredMethods()不返回它在数组中,因为smoothScrollBy是一个方法的AbsListView,这是继承由ListView和最终touchininterceptor。

在调用getClass(). getdeclaredmethods()之前,我已经尝试将此转换为AbsListView,但没有成功。

我怎样才能正确地获得smoothScrollBy,以便我可以在可用时调用它?

更新:

我还尝试了以下方法,但没有效果:

        Method test = null;
        try {
            test = this.getClass().getMethod("smoothScrollBy", new Class[] { Integer.class });
        }
        catch (NoSuchMethodException e) {
        }

这是因为它是一个继承方法。getDeclaredMethods()只检索在您的类中声明的方法,而不是其超类的方法。虽然我从来没有真正这样做过,但您应该能够调用getSuperclass(),直到找到声明该方法的类(AbsListView)并从中获取方法。

一个更简单的答案可能只是检查API的版本:通过编程获得设备的Android API级别?

我不确定,但我认为如果你的应用程序针对API 7,那么方法将找不到,因为它将不存在。你可以以API 8为目标,并在清单中列出你只需要API 7级。

创建一个名为hasMethod(Class cls, String method)或类似的方法,递归地在继承层次结构中调用自己:

public boolean hasMethod(Class cls, String method) {
    // check if cls has the method, if it does return true
    // if cls == Object.class, return false
    // else, make recursive call
    return hasMethod(cls.getSuperclass(), method);
}

感谢您的回复。我通过以下方法解决了这个问题:

    try {
        mSmoothScrollBy = this.getClass().getMethod("smoothScrollBy", new Class[] { int.class, int.class });
    }
    catch (NoSuchMethodException e) {
    }

我有我正在寻找的方法的参数列表不正确。

相关内容

  • 没有找到相关文章

最新更新