带有泛型的接口方法实现类使用反射获取方法参数类型时多一个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个回答

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

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

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

hbshzl
hbshzl 回复whandwho: 多谢!
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: 接着我试了 “T” 改成 String,实现类多加了一个方法 ,参数是String,下面又是两个test,一个integer,一个String,所以已经很明显了,会将上层接口的method算进去。最开始是 T,只可以算作 Object。完。
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: 首先建议楼主 把所有的method打印一下看一下,然后是getDeclaredMethods 与 getMethods 是不一样的,我试了一下楼主所说的问题,接口里面的test去掉后,下面只有一个,然后我试了一下,将test里面的 “T”改成了 Integer ,下面也只有一个 test。
大约一年之前 回复
hbshzl
hbshzl 回复whandwho: 我明白你的意思了,是你说的出现两个test方法,但是还有个问题,我试了下把接口的泛型定义去掉,改用具体参数类型就会只有一个test方法,这是什么原因啊?
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: 楼主想清楚了请采纳一下。
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: 楼主?
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: 你在第一个循环下面加一个打印method的语句就很明显了。 望采纳。
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: for (Method method : methodArray) { System.out.println("....."+method); if ("test".equals(method.getName())) { for (Class clazz : method.getParameterTypes()) { System.out.println(clazz); } } }
大约一年之前 回复
whandwho
大川里的小川人 回复hbshzl: 不是,你在第一个循环下面打印一下,是有两个method,不是有两个参数,第一个循环是两次,第二次循环只有一次。
大约一年之前 回复
hbshzl
hbshzl 回复whandwho: 是test方法定义的是一个参数,而method.getParameterTypes()返回的是两个参数类型,运行test就能看出来
大约一年之前 回复
whandwho
大川里的小川人 楼主?
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!