热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java中的类如何选取,java里如何获取泛型的类型

jdk1.5开始支持泛型,所以我们有时需要把泛型里定义的对象的类型拿到,研究了一下sample代码可以这样来做比如现在我定义了三个类Account&#x

jdk1.5开始支持泛型,所以我们有时需要把泛型里定义的对象的类型拿到,研究了一下sample代码

可以这样来做

比如现在我定义了三个类Account, AccountItem和Product类。

Account聚合AccountItem,AccountItem聚合Prodcut。

都是用List和List来表示的

我要实现一个功能,需要动态的传入一个Class的类型,然后反射到启动的List,根据List里定义的泛型,知道其中List的具体对象。

这个需求主要是由于现在的Json-lib还不支持深度的List的unmarshall,而只支持数组的方式。其实这里就是json-lib的beanfactory用到ezmorpher,而ezmorpher不支持泛型的定义方式,所以不知道类型,全转成MorpherDynBean,这样的对象是我们不需要的。

这样需要修改ezmorpher的代码,注入自己的MorpherBean的processor,这个processor就根据泛型拿到,我们需要转型的对象。

代码片段如下

引用:

Field[] fs = clazz.getDeclaredFields(); // 得到所有的fields

for(Field f : fs)

{

Class fieldClazz = f.getType(); // 得到field的class及类型全路径

if(fieldClazz.isPrimitive())  continue;  //【1】 //判断是否为基本类型

if(fieldClazz.getName().startsWith("java.lang")) continue; //getName()返回field的类型全路径;

if(fieldClazz.isAssignableFrom(List.class)) //【2】

{

Type fc = f.getGenericType(); // 关键的地方,如果是List类型,得到其Generic的类型

if(fc == null) continue;

if(fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型

{

ParameterizedType pt = (ParameterizedType) fc;

Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //【4】 得到泛型里的class类型对象。

m.put(f.getName(), genericClazz);

Map m1 = prepareMap(genericClazz);

m.putAll(m1);

}

}

}

【解释】:

1、isPrimitivepublic boolean isPrimitive()判定指定的 Class 对象是否表示一个基本类型。

有九种预定义的 Class 对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 boolean、byte、char、short、int、long、float 和 double。 【注:像Integer,Boolean等包装类不是基本类型!】

这些对象仅能通过下列声明为 public static final 的变量访问,也是使此方法返回 true 的仅有的几个 Class对象。返回: 当且仅当该类表示一个基本类型时,才返回 true从以下版本开始:JDK1.12、isAssignableFrom

Java代码

System.out.println(String.class.isAssignableFrom(Object.class));

//打印true

AA.class.isAssignableFrom(BB.class)的作用是判定AA表示的类或接口是否同参数BB指定的类表示的类或接口相同,或AA是否是BB的父类。

eg:System.out.println( String.class.isAssignableFrom(Object.class) ) ;       false

System.out.println( Object.class.isAssignableFrom(Object.class) );       true

System.out.println( Object.class.isAssignableFrom(String.class) );        true

String ss = "";

System.out.println( ss instanceof Object );                                            true

Object o = new   Object();

System.out.println( o instanceof Object );                                              true

3、ParameterizedType 表示参数化类型,如 Collection。

4、getGenericSuperclass, getSuperclass, getActualTypeArguments

说明

1.Class super T> getSuperclass():返回本类的父类

2.Type getGenericSuperclass():返回本类的父类,包含泛型参数信息

例子

1.ClassA.java

public class  ClassA {

private T obj;

public void setObject(T obj) {      this.obj = obj;  }

public T getObject() {    return obj;   }

}

2.Test.java

import java.lang.reflect.Type;

import java.lang.reflect.ParameterizedType;

public class Test extends ClassA{

public static void main(String args[]) throws Exception{

System.out.println("======getSuperclass======:");

System.out.println(Test.class.getSuperclass().getName());

System.out.println("======getGenericSuperclass======:");

Type t = Test.class.getGenericSuperclass();

System.out.println(t);

if (ParameterizedType.class.isAssignableFrom(t.getClass())) {

System.out.print("----------->getActualTypeArguments:");

for (Type t1:((ParameterizedType)t).getActualTypeArguments()) {

System.out.print(t1 + ",");

}

System.out.println();

}

}

}

输出结果:

======getSuperclass======:

ClassA

======getGenericSuperclass======:

ClassA

----------->getActualTypeArguments:T,



推荐阅读
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
author-avatar
手机用户2702935673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有