java中的接口是类吗
809
2023-05-12
Java 获取泛型的类型实例详解
java 获取泛型的类型实例详解
Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等。
以下方式是不正确的:
①.获取带泛型的类的类型
Class lstUClazz = List
②获取局部变量泛型的类型
List
Type genType = listUser.getClass().getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType)
{
//无法获取到User类,或者可能获取到错误的类型,如果有同名且不带包名的泛型存在
ParameterizedType paramfeqsweHeterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
那么,如何才能获取到泛型的类型
①.必须具有真实类型的存在
②.泛型的类型是明确的如(List
满足以上两点,我们就可以获取泛型的类型了
1.通过继承方式,明确类型,然后获取泛型类
public abstract class JdbcDaoSupport
protected JdbcDaoSupport() {
}
public Class getTempalteType()
{
Class
.getGenericSuperclass()).getActualTypeArguments()[0];
return clazz;
}
}
public class UserDao extends JdbcDaoSupport
}
public class Test{
public static void main(String[] args)
{
UserDao dao = new UserDao();
Class clazz = dao.getTemplateType();
System.out.println(clazz.getName()); //输出 xxx.xxx.User
}
}
2.获取类属性的泛型类型
public class Test extends ClassA
private List
private Map
/***
* 获取List中的泛型
*/
public static void testList() throws NoSuchFieldException, SecurityException {
Type t = Test.class.getDeclaredField("list").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}
/***
* 获取Map中的泛型
*/
public static void testMap() throws NoSuchFieldException, SecurityException {
Type t = Test.class.getDeclaredField("map").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}
public static void main(String args[]) throws Exception {
System.out.println(">>>>>>>>>>>testList>>>>>>>>>>>");
testList();
System.out.println("<<<<<<<<<< System.out.println(">>>>>>>>>>>testMap>>>>>>>>>>>"); testMap(); System.out.println("<<<<<<<<<< System.out.println(">>>>>>>>>>>testClassA>>>>>>>>>>>"); new Test().testClassA(); System.out.println("<<<<<<<<<< } } 3.获取局部变量的泛型的类型 List Type genType = listUser.getClass().getClass().getGenericSuperclass(); Class templatClazz = null; if(ParameterizedType.class.isInstance(genType) { ParameterizedType parameterizedType = (ParameterizedType) genType; templatClazz = (Class) parameterizedType.getActualTypeArguments()[0]; } 实际上,我们发现,能获取到泛型的类型实际上都是进行了“继承”。当然如果能熟练运用上述技巧,可以做很多事情,比如开源项目Gson中的TypeToken就是利用上述技巧,实现json与复杂类型的转换的。 很多情况下,Class被用来当作参数,我们其实可以将带泛型的类作为参数传入 我们一般为了方便,很少去特定定义一个类,因此,我们需要使用如下方式了。 Class clz = new ArrayList 例子 class JsonToObjectUtil { public static Type genType = clz.getClass().getGenericSuperclass(); Class templatClazz = null; if(ParameterizedType.class.isInstance(genType)); { ParameterizedType parameterizedType = (ParameterizedType) genType; templatClazz = (Class) parameterizedType.getActualTypeArguments()[0]; } List /*****/ if(templatClazz!=null && jsonList!=null) { for (String str : jsonList) { Gson gson = new Gson(); Object fromJson = gson.fromJson(str, templatClazz); lst.add(fromJson); } } /*****/ return (T) lst; } public static void main(String[] args) { List //略去一部分填充jsonList的逻辑 Class superClazz = new ArrayList List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList); } } 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
System.out.println(">>>>>>>>>>>testMap>>>>>>>>>>>");
testMap();
System.out.println("<<<<<<<<<< System.out.println(">>>>>>>>>>>testClassA>>>>>>>>>>>"); new Test().testClassA(); System.out.println("<<<<<<<<<< } } 3.获取局部变量的泛型的类型 List Type genType = listUser.getClass().getClass().getGenericSuperclass(); Class templatClazz = null; if(ParameterizedType.class.isInstance(genType) { ParameterizedType parameterizedType = (ParameterizedType) genType; templatClazz = (Class) parameterizedType.getActualTypeArguments()[0]; } 实际上,我们发现,能获取到泛型的类型实际上都是进行了“继承”。当然如果能熟练运用上述技巧,可以做很多事情,比如开源项目Gson中的TypeToken就是利用上述技巧,实现json与复杂类型的转换的。 很多情况下,Class被用来当作参数,我们其实可以将带泛型的类作为参数传入 我们一般为了方便,很少去特定定义一个类,因此,我们需要使用如下方式了。 Class clz = new ArrayList 例子 class JsonToObjectUtil { public static Type genType = clz.getClass().getGenericSuperclass(); Class templatClazz = null; if(ParameterizedType.class.isInstance(genType)); { ParameterizedType parameterizedType = (ParameterizedType) genType; templatClazz = (Class) parameterizedType.getActualTypeArguments()[0]; } List /*****/ if(templatClazz!=null && jsonList!=null) { for (String str : jsonList) { Gson gson = new Gson(); Object fromJson = gson.fromJson(str, templatClazz); lst.add(fromJson); } } /*****/ return (T) lst; } public static void main(String[] args) { List //略去一部分填充jsonList的逻辑 Class superClazz = new ArrayList List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList); } } 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
System.out.println(">>>>>>>>>>>testClassA>>>>>>>>>>>");
new Test().testClassA();
System.out.println("<<<<<<<<<< } } 3.获取局部变量的泛型的类型 List Type genType = listUser.getClass().getClass().getGenericSuperclass(); Class templatClazz = null; if(ParameterizedType.class.isInstance(genType) { ParameterizedType parameterizedType = (ParameterizedType) genType; templatClazz = (Class) parameterizedType.getActualTypeArguments()[0]; } 实际上,我们发现,能获取到泛型的类型实际上都是进行了“继承”。当然如果能熟练运用上述技巧,可以做很多事情,比如开源项目Gson中的TypeToken就是利用上述技巧,实现json与复杂类型的转换的。 很多情况下,Class被用来当作参数,我们其实可以将带泛型的类作为参数传入 我们一般为了方便,很少去特定定义一个类,因此,我们需要使用如下方式了。 Class clz = new ArrayList 例子 class JsonToObjectUtil { public static Type genType = clz.getClass().getGenericSuperclass(); Class templatClazz = null; if(ParameterizedType.class.isInstance(genType)); { ParameterizedType parameterizedType = (ParameterizedType) genType; templatClazz = (Class) parameterizedType.getActualTypeArguments()[0]; } List /*****/ if(templatClazz!=null && jsonList!=null) { for (String str : jsonList) { Gson gson = new Gson(); Object fromJson = gson.fromJson(str, templatClazz); lst.add(fromJson); } } /*****/ return (T) lst; } public static void main(String[] args) { List //略去一部分填充jsonList的逻辑 Class superClazz = new ArrayList List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList); } } 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
}
}
3.获取局部变量的泛型的类型
List
Type genType = listUser.getClass().getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType)
{
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
实际上,我们发现,能获取到泛型的类型实际上都是进行了“继承”。当然如果能熟练运用上述技巧,可以做很多事情,比如开源项目Gson中的TypeToken就是利用上述技巧,实现json与复杂类型的转换的。
很多情况下,Class被用来当作参数,我们其实可以将带泛型的类作为参数传入
我们一般为了方便,很少去特定定义一个类,因此,我们需要使用如下方式了。
Class clz = new ArrayList
例子
class JsonToObjectUtil {
public static
Type genType = clz.getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType));
{
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
List
/*****/
if(templatClazz!=null && jsonList!=null)
{
for (String str : jsonList) {
Gson gson = new Gson();
Object fromJson = gson.fromJson(str, templatClazz);
lst.add(fromJson);
}
}
/*****/
return (T) lst;
}
public static void main(String[] args) {
List
//略去一部分填充jsonList的逻辑
Class superClazz = new ArrayList
List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList);
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~