如何获取java泛型的参数类型

如何获取java泛型的参数类型,第1张

一般可以使用反射来获取泛型参数的实际类型,以下是详细代码:
import javalangreflectField;
import javalangreflectParameterizedType;
import javalangreflectType;
import javautilMap;

public class GenericTest {
/使用反射来获取泛型信息/
private Map<String, Integer> score;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
//Class clazz = GenericTestclass;
Class<GenericTest> clazz = GenericTestclass;
//Systemoutprintln(clazz);
Field f = clazzgetDeclaredField("score");

//直接使用getType只对普通类型有效,无法取到泛型参数
Class<> a = fgetType();
Systemoutprintln("score的类型是:"+a);

//获得Field实例f的泛型类型
Type gType = fgetGenericType();
//如果gType类型是ParameterizedType的对象
if (gType instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) gType;
//获取原始类型
Type rType = pTypegetRawType();
Systemoutprintln("原始类型是:"+rType);
//取得泛型类型参数
Type[] tArgs = pTypegetActualTypeArguments();
Systemoutprintln("泛型类型是:");
for (int i = 0; i < tArgslength; i++) {
Systemoutprintln("第"+i+"个泛型类型是:"+tArgs[i]);
}
}else{
Systemoutprintln("获取泛型类型出错!");
}
}
}
输出结果如下:
score的类型是:interface javautilMap
原始类型是:interface javautilMap
泛型类型是:
第0个泛型类型是:class javalangString
第1个泛型类型是:class javalangInteger

可以这么搞:
Assembly asm = AssemblyLoad("UITestDesignTools10");//加载反射的dll
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值
parameters[1] = 123456 ;//给第2个参数赋值
Object instanceObj = asmCreateInstance("WindowsFormsfrmControlStyle", true, SystemReflectionBindingFlagsDefault, null, parameters, null, null); //反射获取指定类的对象
Form f = instanceObj as Form;
fShow()
上面这样就已经在反射对象的时候传参了。这里是给构造方法传参,
如果是给类里面的方法传参,看下面的
------------------------------------------------分割线----------------------------------------------------------
如果非要用invoke的话,稍改动一下
Type testClassType = TypeGetType( "TestTestClass", false );
if ( testClassType != null )
{
object instance = ActivatorCreateInstance( testClassType, 10, 20 );
MethodInfo test1 = testClassTypeGetMethod( "Test1", BindingFlagsInstance | BindingFlagsPublic );
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值()
parameters[1] = 123456 ;//给第2个参数赋值
test1Invoke( instance, parameters );
}

获得方法的代码如下,字段的类似

/
  Project Name [online-courses]
  File Name      [day02genericGenericDemo5java]
  Creation Date  [2016-11-23]
  <p>
  Copyright© 2016 geyyang@hotmailcom All Rights Reserved
  <p>
  Work hard, play harder, think big and keep fit
 /
package day02generic;
import javalangreflectMethod;
import javalangreflectParameterizedType;
import javalangreflectType;
import javautilList;
/
  泛型示例-使用反射获取泛型类型<br />
 
  @author <a href="mailto:geyyang@hotmailcom">杨舸</a>
  @version 100
  @since jdk 18
 /
public final class GenericDemo5 {
    public void testGenericReflection(List<String> list) {
    }
    /
      测试方法<br />
     
      @param args 命令行参数
      @throws Exception 抛出的异常
     /
    public static void main(String[] args) throws Exception {
        Method method = GenericDemo5classgetMethod("testGenericReflection", Listclass);
        Type[] parameterTypes = methodgetGenericParameterTypes();
        ParameterizedType parameterType = (ParameterizedType) parameterTypes[0]; // 获得第一个泛型参数, Collection类型的集合只有一个泛型参数, Map类型的集合有两个泛型参数
        Systemoutprintln(parameterTypegetRawType()); // interface javautilList
        Systemoutprintln(parameterTypegetTypeName()); // javautilList<javalangString>
        Systemoutprintln(parameterTypegetActualTypeArguments()[0]); // class javalangString
    }
}

class Bh后面加个<L>是 泛型的标志,也可以是其它任何的大写字母,M,N,T都行,表示Bh 这个类的一系列类型;
比如说有个class 为Color<C>,此处的<C>为一种类型,如果没有<C>,表示,只能new Color();有泛型后,你可以new Color<Red> 或 new Color<Blue> 等等一系列类型;

Method m = clazzgetDeclaredMethod("methodCompareCommon", Listclass, Objectclass, Objectclass, Objectclass);
直接这样就可以反射到你的方法,而且调用时,minvoke()里面的参数也全是Object的。你要想实现多态的话,那你要传的参数是继承自最顶层的Object了,那就必须得判断了,如果是你自己的一个类的话,就直接可以把父类对象当成方法的参数,然后可以传子类的对象

这是一个泛型方法,返回值是Class<T>类型的

看看这个>

返回值类型是Class类型

var listType = typeof(List<>);
var listOfAType = listTypeMakeGenericType(new[] { aGetType() });


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13326418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-15
下一篇 2023-07-15

发表评论

登录后才能评论

评论列表(0条)

保存