在继承方法上使用反射的正确方法

时间:2011-08-09 19:46:11

标签: android reflection

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

TouchInterceptor类调用一个名为smoothScrollBy的方法。此方法仅适用于API 8 +。

我想在API 7+上定位我的应用程序,所以我只需要使用反射来执行smoothScrollBy。

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

    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方法并将其分配给名为mSmoothScrollBy(Method)的TouchInterceptor的新成员变量。

我正在通过Android 2.2(API 8)模拟器进行调试,遗憾的是,从未找到该方法。我的猜测是getDeclaredMethods()不会在数组中返回它,因为smoothScrollBy是AbsListView的一个方法,它由ListView和最终的TouchInterceptor继承。

我在调用getClass()。getDeclaredMethods()之前尝试将它转换为AbsListView但没有成功。

我如何才能正确获得smoothScrollBy,以便在可用时调用它?

更新

我也试过以下无济于事:

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

        }

4 个答案:

答案 0 :(得分:1)

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

更简单的答案可能只是检查API的版本:Programmatically obtain the Android API level of a device?

答案 1 :(得分:0)

我不确定,但我认为如果您将应用程序定位到API 7,则无法找到该方法,因为它不存在。您可以在清单中定位API 8并列出您只需要API级别7的内容。

答案 2 :(得分:0)

创建一个名为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);
}

答案 3 :(得分:0)

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

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

    }

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