-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DialogFragment重写getContext方法出现栈溢出 #647
Labels
bug
Something isn't working
Comments
shifujun
added a commit
to shifujun/Shadow
that referenced
this issue
Oct 21, 2021
原本希望简化Fragment的支持,不修改Fragment的父类了。 但是这里Fragment的子类如果override getContext方法, 在原本采用静态方法fragmentGetContext的方式支持会造成 super.getContext调用循环调用调用自身。 考虑到Fragment的子类的子类也都有override getContext方法的可能, 最简单的支持方法还是将Fragment的直接子类的父类都改为ShadowFragment, 然后ShadowFragment通过override getContext方法来支持将 宿主Activity还原为插件Activity的能力。 不一样的是getHost方法由于是final的,所以不用这样支持。 fix Tencent#647
shifujun
added a commit
to shifujun/Shadow
that referenced
this issue
Oct 21, 2021
原本希望简化Fragment的支持,不修改Fragment的父类了。 但是这里Fragment的子类如果override getContext方法, 在原本采用静态方法fragmentGetContext的方式支持会造成 super.getContext调用循环调用调用自身。 考虑到Fragment的子类的子类也都有override getContext方法的可能, 最简单的支持方法还是将Fragment的直接子类的父类都改为ShadowFragment, 然后ShadowFragment通过override getContext方法来支持将 宿主Activity还原为插件Activity的能力。 不一样的是getHost方法由于是final的,所以不用这样支持。 fix Tencent#647
shifujun
added a commit
to shifujun/Shadow
that referenced
this issue
Oct 22, 2021
redirectMethodCallToStatic方法复用了TransformCall的匹配逻辑, 即`if (c == INVOKEINTERFACE || c == INVOKESPECIAL || c == INVOKESTATIC || c == INVOKEVIRTUAL)` 其中INVOKESPECIAL即包含super调用。而我们在替换fragmentGetContext方法时,并不需要对super调用进行转换。 如果转换会导致fragmentGetContext静态方法中对fragment的getContext调用循环回自身。 因此对这种情况忽略INVOKESPECIAL调用,添加新方法redirectMethodCallExceptSuperCallToStatic。 fix Tencent#647
shifujun
added a commit
that referenced
this issue
Oct 22, 2021
redirectMethodCallToStatic方法复用了TransformCall的匹配逻辑, 即`if (c == INVOKEINTERFACE || c == INVOKESPECIAL || c == INVOKESTATIC || c == INVOKEVIRTUAL)` 其中INVOKESPECIAL即包含super调用。而我们在替换fragmentGetContext方法时,并不需要对super调用进行转换。 如果转换会导致fragmentGetContext静态方法中对fragment的getContext调用循环回自身。 因此对这种情况忽略INVOKESPECIAL调用,添加新方法redirectMethodCallExceptSuperCallToStatic。 fix #647
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
麻烦看下
The text was updated successfully, but these errors were encountered: