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

1个回答

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

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

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

0
hbshzl
hbshzl 回复whandwho: 多谢!
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: 接着我试了 “T” 改成 String,实现类多加了一个方法 ,参数是String,下面又是两个test,一个integer,一个String,所以已经很明显了,会将上层接口的method算进去。最开始是 T,只可以算作 Object。完。
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: 首先建议楼主 把所有的method打印一下看一下,然后是getDeclaredMethods 与 getMethods 是不一样的,我试了一下楼主所说的问题,接口里面的test去掉后,下面只有一个,然后我试了一下,将test里面的 “T”改成了 Integer ,下面也只有一个 test。
9 个月之前 回复
hbshzl
hbshzl 回复whandwho: 我明白你的意思了,是你说的出现两个test方法,但是还有个问题,我试了下把接口的泛型定义去掉,改用具体参数类型就会只有一个test方法,这是什么原因啊?
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: 楼主想清楚了请采纳一下。
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: 楼主?
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: 你在第一个循环下面加一个打印method的语句就很明显了。 望采纳。
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: for (Method method : methodArray) { System.out.println("....."+method); if ("test".equals(method.getName())) { for (Class clazz : method.getParameterTypes()) { System.out.println(clazz); } } }
9 个月之前 回复
whandwho
大川里的小川人 回复hbshzl: 不是,你在第一个循环下面打印一下,是有两个method,不是有两个参数,第一个循环是两次,第二次循环只有一次。
9 个月之前 回复
hbshzl
hbshzl 回复whandwho: 是test方法定义的是一个参数,而method.getParameterTypes()返回的是两个参数类型,运行test就能看出来
9 个月之前 回复
whandwho
大川里的小川人 楼主?
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java反射获取实际泛型类型参数
我们知道,一个Java的类主要包括两个元素,即是成员变量和成员方法。成员变量包括实例成员变量和静态成员变量,而成员方法也有实例成员方法和静态成员方法,构造方法则是特殊的成员方法。而反射的主要作用是能够在运行时获取一个Class的各个元素的结构,但无法更改这些元素的结构。这些元素就是前面说的成员变量和成员方法,并且对于成员变量,反射可以对其进行设值和取值,对于成员方法,反射可以直接对其进行方法调用,...
java通过反射获取泛型参数
测试一种便捷开发的模型,常用于数据库的D、层次。其中用到反射来获取泛型参数。n首先定义一个Generictor接口,定义接口方法。n/**n * n */npackage com.zjq.container;nn/**n * @author zhangjiaqin * 写一个生成器接口n *n */npublic interface Generator {n n /**n * @return
java再复习——通过反射获取到方法的参数和返回值的泛型类型
我们都知道了可以定义带有泛型参数的方法,以及泛型返回值的方法了,那么泛型在运行的时候已经被擦除了,我们该如何知道这个泛型到底是什么呢?有很多情况需要知道实际泛型是什么,Android数据库框架以及Http框架在解析成json成实体类的时候,必然要知道是哪个类。rn获取参数的泛型API方法:rnpublic class GenericParameterizedTypeDemo {nn public
java 反射机制(通过getGenericSuperclass()方法获取到父类泛型的类型)
1. 在java中T.getClass() 或 T.class都是不合法的,因为T是泛型变量; n    由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;n2.获取方式是:n// 获取当前运行类泛型父类类型,即为参数化类型,有所有类型公用的高级接口Type接收!n Type type = this.getClass().getGenericSuperclass();n /
为什么Collection接口的remove方法参数类型是Object而不是类型参数(泛型)
       在jdk1.2版本之后的Collection接口被泛型化了,add方法的参数类型为泛型,remove方法的参数类型依然为Object,既然add添加元素时严格限制类型,保证了列表元素结构不被破坏,remove删除却放宽了类型限制,有点不合常理,查阅资料,了解到这样做的原因既有逻辑上的考虑,也有技术上的妥协,可能当时没有更好的解决办法。nn一、从remove方法含义上看nn      ...
反射对应泛型参数的调用
package invokeGenerator;rnrnimport java.lang.reflect.Field;rnimport java.lang.reflect.Method;rnimport java.lang.reflect.ParameterizedType;rnimport java.lang.reflect.Type;rnimport java.util.Arrays;rnim
java 反射机制 (获取父类泛型的类型)getGenericSuperclass
1.首先, T.getClass() 或 T.class都是非法的,因为T是泛型变量; rn    由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;rn2.获取方式是:rnClass entityClass = (Class ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArgumen
Java -- 获取实现接口的泛型的参数化类型和实际类型参数
前言:在向上抽取功能时可能会有需要获取到实现接口的实际泛型参数类型这样的需求,分享一下自己实现的方法。nn一、Java 代码nn直接上代码,代码上有注释,对API做了相应的解释。nnnnpublic BasicAction(){nn try {nn //获取子类字节码文件对象,this代表的是子类对象。n Class clazz = thi...
获取实现接口的的第一个泛型实例工具类
package cn.baozun.crm.base.util;rnrnrn/**rn * Copyright (c) 2005-2009 springside.org.cnrn *rn * Licensed under the Apache License, Version 2.0 (the "License");rn * rn * $Id: ReflectionUtils.java,v 1.2
DAO重构之父类(泛型参数)获取子类传过来的类型
1.public class EmployeeDAOImpl extends GenericDAOImpl&amp;lt;Employee&amp;gt;2.public class GenericDAOImpl&amp;lt;T&amp;gt; implements IGenericDAO&amp;lt;T&amp;gt; 比如,从2中获取子类传过来的Employee,方法如下:在父类(GenericDAOImpl)中://获取子类中父类实现...
通过反射获取泛型参数数组(Class对象 List类型)
/**rnrn* 获取某一个字段上面的泛型参数数组,典型的就是获取List对象里面是啥参数rn* rn* @param frn* @returnrn*/rnpublic static Class[] getParameterizedType(Field f) {rnrnrn// 获取f字段的通用类型rnType fc = f.getGenericType(); // 关键的地方得到其Generic
反射机制获取方法的参数类型和返回值类型
package com.buaa.reflectTest;nnimport java.lang.reflect.Method;nimport java.lang.reflect.ParameterizedType;nimport java.lang.reflect.Type;nimport java.util.List;nimport java.util.Map;nnpublic class De
JAVA 利用反射执行带有泛型参数的方法
虽然本文旨在说明如何利用反射执行带有泛型参数的方法,但是还是先来看下这个议题的背景吧,我们的服务要接入公司里面另一个平台的一个服务,我们的服务是Java语言开发,他们的服务是PHP开发,虽然远程过程调用无关乎语言,但是在传参方面遇到了一些小问题;除此之外,还记得远程过程调用需要客户端的存根和服务器端的骨架嘛,当然这都是后话了。nn 1.先来看下他们的接口地址:http://...
C# 反射调用带参数的重载的泛型方法
C# 反射调用带参数的重载的泛型方法。n以及调用时抛出:不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作异常的解决办法。nnnn话不多说,上代码!n   class Aan {n public string CreateSql()n {n return "Aa类无参泛型方法"
java 反射遍历类方法,方法参数类型,形参名称
Class object = Model.class;n//Method[] methods = object.getMethods();//所有方法,包括继承Object的nMethod[] methods = object.getDeclaredMethods();//自己的public方法nfor(Method one:methods)n{n System.out.print(one.g...
Spring 泛型 反射调用方法
[code=&quot;java&quot;]rnObject cz=springUtil.getBean(cl);//传入参数Class,返回泛型,这里的声明必须为object,否则会报各种错误rnMethod method=cz.getClass().getMethod(methodName);rnmethod.invoke(cz);rn[/code]...
Java反射通过class获取父类泛型类型
Java反射通过class获取子类泛型类型nn在Java的反射技术中,通过Method和Field对象很容易就可以取出泛型类型的具体类型。但是普通类的泛型参数在编译期会被擦除,比如定义了一个List对象,在运行期我们可以拿到的信息就只剩下List,并不知道List中的元素类型是什么。这也说明了,为什么fun(List list)和 fun(List)会被编译器认为是相同的函数。n但是,对于获
反射解析jar包 并获取List集合的泛型类型与数组的对象类型(两种情况实体类属性为List和方法体参数为List)
上传MultipartFile类型jar包,反射解析jar包 获取方法详情,实体类属性或方法体参数为List(数组)时,获取List集合的泛型类型数组的对象类型直接上代码:(方法体做了简化,其中的Class genericType为泛型类型),有问题或者有更简单的方法请指正... 1.  方法体参数为集合*(数组)时,获取集合(数组)的泛型类型    @RequestMapping(value =...
Java 小细节——方法基本类型参数的重载
n 阅读2分钟,掌握一个Java小细节,你值得拥有!nnn方法重载指的是方法名相同,参数列表不同(不同的参数类型或者参数顺序或者参数个数)的情况。不过你真的了解么?看看下面这个例子。nnpublic class PrimitiveOverloading {n void f1(char x){n System.out.println(&quot;f1(char)&quot;);n }n ...
C#通过反射获取类中的方法和参数个数,反射调用方法带参数
using System;nusing System.Reflection;nnnamespace ConsoleApp2n{n class Programn {n static void Main(string[] args)n {n //反射获取 命名空间+类名n string className = &quot;Con...
如何获取方法参数的泛型类型
public class GenericClass {rn    public static voidmain(String args[]) throws SecurityException, NoSuchMethodException {rn         rn        //通过方法,可以获取方法上的参数的泛型类型rn        MethodapplyMethod = Generic
java反射中参数问题
getDeclaredMethod与getMethod区别,还有参数必须是数组吗?n函数原型:Method getMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes) ngetDeclaredMethod获取该类“自身的”所有的方法(private、default、protect、public),但不包括继承的方法。ngetMethod只能获...
泛型之多种类型参数
package fft.generics;rnrn//定义接口,接口中使用泛型rnpublic interface Pair {rn    rn    public K getKey();rn    rn    public V getValue();rn}rnrnrnrnrnrnrnrnpackage fft.generics;rnrn/**rn * rn * @ClassName: Order
Java反射获取泛型工具类
import java.lang.reflect.Field;rnimport java.lang.reflect.Method;rnimport java.lang.reflect.ParameterizedType;rnimport java.lang.reflect.Type;rnimport java.util.ArrayList;rnimport java.util.List;rnrn/...
反射获取方法名及参数名,反射获取参数作为对象使用
在某些时候,我们可能需要反射技术来获取其方法来使用它,但是方法名,方法的参数可能全都不知道rn传入的参数具体是什么我们也不知道rn例如,在使用切面的时候,rnProceedingJoinPoint种getArgs也只是一个Object数组集rn如何确定数组中某个元素就是我们想要的参数呢rn下面是一块代码片段,是从切面方法之中截取的,   object xxx(ProceedingJoinPoint
C# 使用反射动态调用泛型方法
通常我们能用到泛型方法时,如nfun<T>()n如果泛型的T类型过多,如果使用swich会产生大量的冗余代码,通过反射动态的生成代码,可以减少大量的代码量。
动态获取 实现类 反射
方法一:SpringContextUtils工具类 上下文获取 Spring 是基于对象层面的依赖注入,不能依赖注入静态对象,也不能通过new获取Bean类的实例化,否则会出现空指针异常,即注入对象为空。可以通过获取ApplicationContext的getBean方法获取bean对象。可以设置工具类获取Spring环境上下文:        当一个类实现了ApplicationContextA...
一个类实现一个接口,可以重写接口中方法的参数类型吗?
答:不可以。rn接口中定义的都是抽象方法,没有实现,所以当有接口被继承后,必须实现接口类中的所有构造方法,这个过程就是重写接口方法,之后可以重新填写方法内容,但是方法的名,参数类型和个数、参数返回值类型不能改变。
Java 泛型参数类型理解
&amp;lt;1&amp;gt;泛型参数类型限制rnrnrnrn(1)rnrn泛型的参数类型只能是类(rnclassrn)类型,而不能是简单类型。rnrnrn(2)rnrn可以声明多个泛型参数类型,比如rn&amp;lt;T, P,Q…&amp;gt;rn,同时还可以嵌套泛型,例如:rn&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;rnrnrn(3)rnrn泛型rn的参数rn类rn型可以使用rnextendsrn语rn句...
利用反射实现子类继承父类的值
利用反射机制实现父类的值赋予子类
(继承方式)反射获取泛型类的类型和对象
1.工具类,用于获取泛型类的类型和对象public abstract class FatherReflectUtils&amp;lt;T&amp;gt; {n public T getTInstance() throws InstantiationException, IllegalAccessException {n Type sType = getClass().getGenericSup...
java利用反射获取泛型参数信息
package com.student.text;nnimport java.awt.Window.Type; nimport java.lang.reflect.Method; nimport java.lang.reflect.ParameterizedType; nimport java.util.List; nimport java.util.Map;nn@SuppressWarnings...
Java动态获取某个接口下所有的实现类对象集合
最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行。我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这个接口,就能自动被加载执行。话不多说,说说我的实现方案。开始想着用反射自己写一个工具类,后面懒得去折腾,就直接用第三方工具包了 , 这里我用的是org.reflections .maven配置: nnorg.reflections nnreflectio
Kotlin泛型类型参数
Kotlin泛型类型参数    泛型允许你定义带类型参数的类型。当这种类型的实例被创建出来的时候,类型参数被替换成称为类型实参的具体类型。例如,如果有一个List类型的变量,弄清楚这个列表中可以存储哪种事物是有意义的。类型参数可以准确清晰地进行描述,就像这样“这个变量保存了字符串列表”,而不是“这个变量保存了一个列表”。Kotlin说明“字符串列表”的语法和Java看起来一样:List&amp;lt;St...
Java通过反射获取方法的参数名 idea的设置
之前阿里面试的时候,面试官问我Java通过反射可以获取到一个方法的形参名称吗?nn听到这个问题我是懵逼的,之前只知道通过反射可以获取方法名,形参的类型,但是从来没有注意可不可以获取方法形参的名称。在网上查了一些资料之后,知道在jdk1.7之前获取方法中形参的名称的是打印arg0类型。但是在jdk1.8之后,已经做了改动。可以获取到形参的名称。nn注意本文的JDK是基于1.8的。1.8版本以下的博主...
java反射(10) 使用反射获取泛型信息
前面说活可以通过Class对象可以获得成员变量的类型,不管该成员变量是不是私有的,但是如果成员变量是有泛型类型的参数的话,如Map&amp;lt;String, Integert&amp;gt;那么将无法获得其泛型参数的信息。n 想要获得泛型参数的信息应该使用以下步骤:n 将Type对象强制转换成ParameterizedType对象n ParameterizedType类提供了getRawType()方法,可...
基于java反射筛选List对于不同实体泛型的公共方法
前提:在最近做的项目当中有个奇葩的需要,就是需要将已知的list<实体类>进行一次筛选,查找list里面属性中的值是否包含某个值(模糊查询)。将符合要求的对象添加到一个list1里面,从而生成一个新的 nlist1<实体类>。 n 在上面的需求当中主要的就是需要在实现这个方法中,能将其需求抽离出来,不管实体类到底是哪个实体类都能调用该方法。 n 所以我们在设置方法的时候需
Java不定类型,不定个数参数方法的写法
java方法的不定类型与不定个数参数public void demo(Object … object ){} n定义多种类型参数用于测试 nint age=12; nString name=”李四”; nint[]a=new int[3]; nString[]b=new String[3]; n调用 ndemo(age); ndemo(name); ndemo(a); ndemo(b); ndemo
java反射和动态代理实现接口记录
项目需求:app含有广告sdk,在上架个别应用市场时会被拒,产品希望在打包时一些渠道包把广告sdk剥离出来(内心是哭泣的)。方法一:每次打包删除jar包,删除与该jar包相关的代码类、接口等等~记录完成,谢谢大家哈哈 开个玩笑,言归正传,以上是我一开始的想法,最笨最笨的方法,没有之一,下面进入主题,用到的东西自然跟标题相关,反射和动态代理。反射其实我是知道用过的,但是项目中没实际用过,动态代理只是
java 基于反射动态调用某个类的方法 【参数是:方法名、参数集合、类的全包名】
反射的用处很大,因为可以在某个类、对象在运行时获得这个对象的属性和方法,更改这个类的属性和方法。曾经在项目中我需要解决一个问题:通过字段来确定他是属于哪个类的,这个时候反射的作用就凸显出来了。今天这篇文字用来记录如何通过反射动态调用某个类的方法。参数:要调用的类的全包名要调用的类的方法名要传入的参数集合/**n * 通用反射方法n * @param classUrl 要调用类的全包名n * ...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java反射学习和使用 学习产品经理的方法