「java泛型获取类型」获取类的泛型
本篇文章给大家谈谈java泛型获取类型,以及获取类的泛型对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
如何取得java泛型里的类型
子父类的方式获取泛型,刚刚写的代码,参考一下。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
*
* 开发公司:SOJSON在线工具 p
* 版权所有:©
* 博客地址:
* p
*
* 注释写这里
*
* p
*
* 区分 责任人 日期说明br/
* 创建 周柏成 2017年4月13日 09:49 br/
*
* @author zhou-baicheng
* @email so@sojson.com
* @version 1.0,2017年4月13日 09:49 br/
*
*/
public class Demo2T,M {
/**
* 这里是子类,写在一个文件里,方便调用,static修饰是为了和当前类同级
* @author Administrator
*
*/
static class SunDemo extends Demo2SunDemo,Demo2{
}
public Demo2() {
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] entityClass = ((ParameterizedType) type).getActualTypeArguments();
System.out.println("获取的泛型类型:");
for (Type t : entityClass) {
Class clazz = (Class)t;
System.out.println(clazz.getCanonicalName());
}
}
}
/**
* 通过实例化子类,父类获取。
* @param args
*/
public static void main(String[] args) {
new SunDemo();
}
}
如何获取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中定义泛型时,怎么获得泛型的类型
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;
}
return (Class) params[index];
}
}
其中BaseT是泛型类,在父类中声明getGenericType,子类继承具体的BaseString,那么在子类中就可以通过getGenericType(0)获取到String的class.
java如何获得泛型中的类
泛型的目的就是为了避免强制类型转换,所以直接取出来就是Object的类型了。
public class ClassTest {
public static void main(String[] args) {
ListString listStr = new ArrayListString();
listStr.add("AAA");
listStr.add("BBB");
System.out.println(listStr.get(0));
}
}
你想要的应该是这个吧,只要取出来就是你定义类型的Object了,在这个例子中是String。如果你给它定义的是Integer类型的泛型的话,取出来就是Integer了。
如何获取 java 的泛型中的对象类型
/**
* 获取field的类型,如果是复合对象,获取的是泛型的类型
*
* @param field
* @return
*/
private static Class getFieldClass(Field field) {
Class fieldClazz = field.getType();
if (fieldClazz.isAssignableFrom(List.class)) {
Type fc = field.getGenericType(); // 关键的地方,如果是List类型,得到其Generic的类型
if (fc instanceof ParameterizedType) // 如果是泛型参数的类型
{
ParameterizedType pt = (ParameterizedType) fc;
fieldClazz = (Class) pt.getActualTypeArguments()[0]; //得到泛型里的class类型对象。
}
}
return fieldClazz;
}
正好这几天刚写了相关代码,供参考
java泛型获取类型的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于获取类的泛型、java泛型获取类型的信息别忘了在本站进行查找喔。
发布于:2022-11-27,除非注明,否则均为
原创文章,转载请注明出处。