arthas icon indicating copy to clipboard operation
arthas copied to clipboard

implements 接口后,`sm` 能查询到2个方法

Open gMan1990 opened this issue 1 year ago • 1 comments

  • [x] 我已经在 issues 里搜索,没有重复的issue。

环境信息

  • arthas-boot version: 3.6.2
  • version 3.6.2
  • 操作系统版本: Alpine Linux v3.14
  • 目标进程的JVM版本: openjdk 17

重现问题的步骤

step1

public interface RocketMQListener<T> {
    void onMessage(T message);
}

step2

public class StringRocketMQListener implements RocketMQListener<String> {
    @Override
    public void onMessage(String s) {
    }
}

step3

# https://arthas.aliyun.com/doc/sm.html
sm StringRocketMQListener onMessage

期望的结果

输出了2个onMessage

实际运行的结果

难道不是应该1个嘛?

gMan1990 avatar Jan 30 '24 07:01 gMan1990

本质上底层是clazz.getDeclaredMethods()。方法的签名由方法的名称和参数类型决定。 当一个类继承自一个泛型接口或继承自一个带有泛型参数的类时,由于类型擦除的原因,编译器会在字节码中生成桥接方法以保持多态性。可以使用method.isBridge()判断是否桥接方法 上面的代码会有两个 onMessage 方法的签名,一个是接口中声明的 onMessage(T message),另一个是实际实现的 onMessage(String message)

官方文档参考:https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html

sirius19 avatar Feb 01 '24 03:02 sirius19