「java反射获取泛型」java传入泛型参数

博主:adminadmin 2022-11-24 22:05:06 65

本篇文章给大家谈谈java反射获取泛型,以及java传入泛型参数对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java反射怎么获取带范型的方法?

java的反射用法:(异常请自行处理)

①找到类:Class cl = Class.forName("java.util.Date");

②创建对象(要求这个类中含有空参数的构造方法):Object obj = cl.newInstence();

③根据名称和参数找方法:Method method1 = cl.getMethod("getTime");//如果没有参数不用写第二个参数如果有参数的如:Method method2 = cl.getMethod("setTime",long.class);

④在某个对象上面执行方法,Object result = method1.invoke(obj);//如果有参数的Object result = method2.invoke(obj,21317362721);

执行的方如果有返回值,将返回值返回,否则返回null

java反射:怎么取出类的泛型类

T.getClass()或者T.class都是非法的,因为T是泛型变量。

由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。

有一种变通的实现方式:

import java.lang.reflect.Array;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

public class Generic extends BaseString {

public static void main(String[] args) {

Generic c = new Generic();

System.out.println(c.array);

}

Object array ;

public Generic() {

array = Array.newInstance(getGenericType(0), 100);

}

}

class BaseT {

public Class getGenericType(int index) {

Type genType = getClass().getGenericSuperclass();

if (!(genType instanceof ParameterizedType)) {

return Object.class;

}

Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

if (index = params.length || index 0) {

throw new RuntimeException("Index outof bounds");

}

if (!(params[index] instanceof Class)) {

return Object.class;

}

如何在运行时获取泛型的类型

在父类的构造方法中,获取泛型的具体类型

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import com.opensymphony.xwork2.ModelDriven;

/**

* 工具类直接返回ModelDriven的对象

*/

public class ModelBaseActionT extends BaseAction implements ModelDrivenT {

protected T model;

/**

* 通过反射,获取泛型的具体类型并实例化这个类型

*/

public ModelBaseAction() {

// 获取反射的类型

java.lang.reflect.Type cls = super.getClass().getGenericSuperclass();

if (cls instanceof ParameterizedType) {

ParameterizedType pt = (ParameterizedType) cls;

// 获取所有放到泛型里面的类型

Type[] tps = pt.getActualTypeArguments();

System.err.println(tps[0].getTypeName());

try {

// 实例化这个泛型所代表的类对象

model = (T) Class.forName(tps[0].getTypeName()).newInstance();

} catch (Exception e) {

throw new RuntimeException("没有默认构造方法", e);

}

}

}

@Override

public final T getModel() {

return model;

}

}

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

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

import java.lang.reflect.Field;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import java.util.Map;

public class GenericTest {

/*使用反射来获取泛型信息*/

private MapString, Integer score;

public static void main(String[] args) throws SecurityException, NoSuchFieldException {

//Class clazz = GenericTest.class;

ClassGenericTest clazz = GenericTest.class;

//System.out.println(clazz);

Field f = clazz.getDeclaredField("score");

//直接使用getType只对普通类型有效,无法取到泛型参数

Class? a = f.getType();

System.out.println("score的类型是:"+a);

//获得Field实例f的泛型类型

Type gType = f.getGenericType();

//如果gType类型是ParameterizedType的对象

if (gType instanceof ParameterizedType) {

ParameterizedType pType = (ParameterizedType) gType;

//获取原始类型

Type rType = pType.getRawType();

System.out.println("原始类型是:"+rType);

//取得泛型类型参数

Type[] tArgs = pType.getActualTypeArguments();

System.out.println("泛型类型是:");

for (int i = 0; i tArgs.length; i++) {

System.out.println("第"+i+"个泛型类型是:"+tArgs[i]);

}

}else{

System.out.println("获取泛型类型出错!");

}

}

}

输出结果如下:

score的类型是:interface java.util.Map

原始类型是:interface java.util.Map

泛型类型是:

第0个泛型类型是:class java.lang.String

第1个泛型类型是:class java.lang.Integer

关于java反射获取泛型和java传入泛型参数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-24,除非注明,否则均为首码项目网原创文章,转载请注明出处。