android - 方法解析中的歧义以及如何解决它

标签 android kotlin byte-buddy

我正在从 ByteBuddy 创建一个动态类,它扩展了我自己的类 SupportMapFragment扩展 Fragment并在布局中使用它。我想将所有对此类的方法调用重定向到 Google 的 SupportMapFragment 的另一个 fragment 实例.

这是我的代码:

        ByteBuddy()
            .subclass(SupportMapFragment::class.java)
            .method(ElementMatchers.any())
            .intercept(MethodDelegation.to(com.google.android.gms.maps.SupportMapFragment.newInstance()))
            .make()
            .load(MainActivity::class.java.classLoader, AndroidClassLoadingStrategy.Injecting(file))
            .loaded

但是,方法解析不能按我的意愿工作。首先是clone()方法有一个模棱两可的委托(delegate)。我可以(以某种方式)通过在方法构建器调用中使用 ElementMathers 过滤方法来解决这个问题。 .但是 fragment 方法也无法解析
Caused by: java.lang.IllegalArgumentException: Cannot resolve ambiguous delegation of public void androidx.fragment.app.Fragment.onPrimaryNavigationFragmentChanged(boolean) to net.bytebuddy.implementation.bind.MethodDelegationBinder$MethodBinding$Builder$Build@83edf592 or net.bytebuddy.implementation.bind.MethodDelegationBinder$MethodBinding$Builder$Build@4349b5d2

我不知道为什么会有任何歧义,我该如何解决这个问题。

最佳答案

对于重定向,您不应使用 MethodDelegation ,而是使用 MethodCall .方法调用允许您在另一个实例或字段上调用检测方法。这样,Byte Buddy 甚至不会花时间试图找出最佳拦截器——这是一个相当昂贵的过程——而是直接调用当前检测的方法。

关于android - 方法解析中的歧义以及如何解决它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62103929/

相关文章:

java - 重新定义方法会覆盖以前的重新定义

java - 如何使用 bytebuddy 更改方法签名?

java - sqlite3查询安卓

android - 使用展开动画打开 Activity

android - 为什么在尝试实例化 Mediaplayer 时会出现 NullPointerException?安卓 Kotlin

java - 发送 GET 请求时无法将类型 'java.lang.String' 的值转换为所需类型 'java.util.Date'

android - 如何在 Android Studio 中使用弃用的 NDK

android - 如何写入和读取具有自定义扩展名的文本文件?

Android 房间数据库错误 : Unused parameter: days in @Query function

java - 经过Byte Buddy改造后,如何在不加载或保存类的情况下获取类信息?