方法解析中的歧义及解决方法
Ambiguity in method resolution and how to solve it
我正在从 ByteBuddy 创建一个动态 class,它扩展了我自己的 class SupportMapFragment
,它扩展了 Fragment
并在布局中使用它。我想将对此 class 的所有方法调用重定向到 Google 的 SupportMapFragment
.
的另一个片段实例
这是我的代码:
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()
方法有一个不明确的委托。我可以(以某种方式)通过使用 ElementMathers
在方法构建器调用中过滤方法来解决这个问题。但是片段方法也无法解析
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 甚至不会花时间尝试找出最佳拦截器(一个相当昂贵的过程),而是直接调用当前检测的方法。
我正在从 ByteBuddy 创建一个动态 class,它扩展了我自己的 class SupportMapFragment
,它扩展了 Fragment
并在布局中使用它。我想将对此 class 的所有方法调用重定向到 Google 的 SupportMapFragment
.
这是我的代码:
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()
方法有一个不明确的委托。我可以(以某种方式)通过使用 ElementMathers
在方法构建器调用中过滤方法来解决这个问题。但是片段方法也无法解析
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 甚至不会花时间尝试找出最佳拦截器(一个相当昂贵的过程),而是直接调用当前检测的方法。