hbshzl 2018-10-13 09:33 采纳率: 100%
浏览 3090
已采纳

带有泛型的接口方法实现类使用反射获取方法参数类型时多一个Object参数

由于业务需要在接口方法中使用了泛型,多个实现类的相同方法传入的实参类型不同,想用反射查看具体的实参类型,进而转换为实参的类型。
但使用中遇到了一个问题,接口定义的方法只有一个“T”参数,反射method.getParameterTypes()却得到两个参数类型,请问各位大牛java内部的实现方式是怎样的?
另外,使用jdk1.8时还会出现反射后的两个参数顺序颠倒的情况,还请各位帮忙分析一下,具体代码如下:

接口

 public interface ProcessTestService<T> {

    void test(T param) throws Exception;
}

实现类

 public class ProcessTestServiceImpl implements ProcessTestService<Integer> {

    @Override
    public void test(Integer param) throws Exception {

    }
}

测试类

public class TestDamo {

    public static void main(String[] args) {
        ProcessTestService processTestService = new ProcessTestServiceImpl();
        Method[] methodArray = processTestService.getClass().getDeclaredMethods();
        labe:for (Method method : methodArray) {
            if ("test".equals(method.getName())) {
                for (Class clazz : method.getParameterTypes()){
                    System.out.println(clazz);
                }
            }
        }
    }
} 
  • 写回答

1条回答

  • 大川里的小川人 2018-10-13 09:45
    关注

    原因是:通过反射获取内部method的时候,其实一个是test 一个 object,至于这个object怎么来的,是因为所有的类顶部都继承了object这个类,如果还不清楚,

        Method[] methodArray = processTestService.getClass().getDeclaredMethods();
    

    楼主你的这个方法里面,getClass 不就是一个方法吗? 这是继承至 object的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作