「java获取泛型类型」java 获取泛型
本篇文章给大家谈谈java获取泛型类型,以及java 获取泛型对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Java中定义泛型时,怎么获得泛型的类型
- 2、如何获取 java 的泛型中的对象类型
- 3、如何在运行时获取泛型的类型
- 4、java中 如何得到泛型参数的类型,并在另一个方法中使用
- 5、java获取泛型class
- 6、java怎么获取一个泛型方法的真实泛型类型
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 的泛型中的对象类型
class Human {
public String toString() {
return "This is human";
}
}
class Man extends Human {
public String toString() {
return "This is man";
}
}
class Woman extends Human {
public String toString() {
return "This is woman";
}
}
public class GetObj {
/**
* 获取泛型的对象类型
*
* @param obj
* 泛型对象
*/
public static T void showInstance(T obj) {
try {
Object tmpObj = obj.getClass().newInstance();// 实例化泛型对象
if (tmpObj instanceof Human) {// Human的对象
System.out.println(tmpObj);
} else if (tmpObj instanceof Man) {// Man的对象
System.out.println(tmpObj);
} else {// Woman的对象
System.out.println(tmpObj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Human h = new Human();
showInstance(h);
Man m = new Man();
showInstance(m);
Woman w = new Woman();
showInstance(w);
}
}
如何在运行时获取泛型的类型
在父类的构造方法中,获取泛型的具体类型
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中 如何得到泛型参数的类型,并在另一个方法中使用
Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,定义泛型 一般用 T 表示. public T ListT method(T t){ 方法体} 。它的参数 就是 T 一个类型,你传什么类型的对象,T就是什么类型。
T将是 可变的类型。
java获取泛型class
很多朋友都想知道java怎么获取泛型class?下面就一起来了解一下吧~
获取泛型Class的方法
Class类的方法:
public Type getGenericSuperclass()
方法作用:
如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。
ParameterizedType类的方法:
Type[] getActualTypeArguments()
方法作用:返回表示此类型实际类型参数的 Type 对象的数组。
注意,在某些情况下,返回的数组为空。如果此类型表示嵌套在参数化类型中的非参数化类型,则会发生这种情况。
二、获取泛型Class对象
(解析Excel的类代码较多,这里定义几个简单的类记录)
定义获取泛型Class对象的工具类
GenericSuperclassUtil
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericSuperclassUtil { /* * 获取泛型类Class对象,不是泛型类则返回null */ public static Class getActualTypeArgument(Class clazz) { Class entitiClass = null; Type genericSuperclass = clazz.getGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass) .getActualTypeArguments(); if (actualTypeArguments != null actualTypeArguments.length 0) { entitiClass = (Class ) actualTypeArguments[0]; } } return entitiClass; } }
定义BaseService ,用来测试不使用父类时泛型Class的获取
BaseService
public class BaseService { public Class getEntityClass() { return GenericSuperclassUtil.getActualTypeArgument(this.getClass()); } }
测试BaseService.getEntityClass() @Testpublic void testBaseService() { System.out.println(new BaseService ().getEntityClass());// 控制台输出:null }
java怎么获取一个泛型方法的真实泛型类型
不知道我对你的题目的理解对不对:有个方法返回一个 泛型 ,你想去这个 泛型 的类型是不是?
package test;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
ListString strings = new ArrayListString();
strings.add("123");//模拟返回一个泛型
System.out.println(strings.getClass());//第一次取类型
System.out.println(strings.get(0).getClass());//假如通过第一步知道是ArrayList类型,则再取类型
}
}
输出结果:
class java.util.ArrayList
class java.lang.String
这里只举例讲一下方法,不知道是不是你想要的,
java获取泛型类型的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 获取泛型、java获取泛型类型的信息别忘了在本站进行查找喔。