首页 > 解决方案 > Android Studio 上的 Java 反射无法找到要调用的公共静态方法

问题描述

我的 Android 应用程序中的 Java 反射代码从包 A 调用包 B 中的公共静态方法。

最近,在一些 Gradle 升级后,我无法调用相同的方法。我的实现因 NoSuchMethodFound 异常而失败。我怎样才能让实现能够找到这个方法?

我已经尝试打印类中所有可用的方法。结果是所有公共非静态方法。没有可调用的静态方法。我要调用的方法是一个静态的“getInstance”方法,它初始化类并返回一个单例实例。

调用代码:

implementationClass = Class.forName(CLIENT_CLASS_NAME, false, ClientProvider.class.getClassLoader());
final Method method = implementationClass.getMethod("getInstance", (Class[]) null);
result = method.invoke(null, (Object[]) null);

调用代码:

/**
* Public static method to be reflected.
*/
public static ClientImpl getInstance() {
    return ClientImplHolder.INSTANCE;
}

/**
 * Private class used to hold the lazily initialized singleton instance.
 */
private static class ClientImplHolder {
    private static final ClientImpl INSTANCE = new ClientImpl();
}

尝试“getMethod”时,我收到 NoSuchMethodException。

不知道我在这里做错了什么,感谢任何帮助。谢谢!

标签: javaandroidapireflection

解决方案


事实证明,Proguard 正在从构建中删除该方法,因为它没有在其他地方使用。为班级添加了一个例外,问题就消失了。


推荐阅读