Java实现泛型解析工具类-GenericsUtils

  • 背景
  • 代码实现

背景

在很多编程场景中,我们需要指导某个对象是属于那个泛型类型的对象或者是那个泛型类型的子类对象,有时需要指导方法返回值对应的泛型参数实际什么类型,那么本工具类就可以方便的帮你解决以上问题。

代码实现

GenericsUtils.java

package com.mesnac.sys.util;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 功能说明:泛型解析工具类* 修改说明:* @author 郑立兵 zhenglb@mesnac.com* @date 2017-3-24 上午11:20:20* @version V1.0*/
public class GenericsUtils {/**** 定义字符集*/private static char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7',   '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',   'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',   'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',   'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',   'Z'};    //72个字符集   /**** 通过反射,获得指定类的父类的泛型参数的实际类型* @param clazz*            clazz 需要反射的类,改类必须继承泛型父类* @param index*          泛型参数所在索引,从0开始* @return*             泛型参数的实际类型,如果没有实现ParameterizedType接口,即不支持泛型,则直接返回<code>Object.class</code>*/@SuppressWarnings("rawtypes")public static Class getSupperClassGenericType(Class clazz, int index) {//得到泛型父类Type genType = clazz.getGenericSuperclass();//如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.classif (!(genType instanceof ParameterizedType)) {return Object.class;}//返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class,如BuyerServiceBean extends DaoSupport<Buyer,Contact>就返回Buyer和Contact类型Type[] params = ((ParameterizedType)genType).getActualTypeArguments();if (index >= params.length || index < 0) {throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));}if (!(params[index] instanceof Class)) {return Object.class;}return (Class)params[index];}/**** 通过反射,获得指定类的父类的泛型参数的实际类型* @param clazz*            clazz 需要反射的类,改类必须继承泛型父类* @return*           泛型参数的实际类型,如果没有实现ParameterizedType接口,即不支持泛型,则直接返回<code>Object.class</code>*/@SuppressWarnings("rawtypes")public static Class getSupperClassGenericType(Class clazz) {return getSupperClassGenericType(clazz, 0);}/**** 通过反射,获得方法返回值泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){} * @param method*          method 方法 * @param index*          泛型参数所在索引,从0开始。* @return*           泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,则直接返回<code>Object.class</code>*/@SuppressWarnings("rawtypes")public static Class getMethodGenericReturnType(Method method, int index) {  Type returnType = method.getGenericReturnType();  if (returnType instanceof ParameterizedType) {  ParameterizedType type = (ParameterizedType) returnType;  Type[] typeArguments = type.getActualTypeArguments();  if (index >= typeArguments.length || index < 0) {  throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));  }  return (Class) typeArguments[index];  }  return Object.class;  }/**** 通过反射,获得方法返回值泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){} * @param method*           method 方法 * @return*           泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,则直接返回<code>Object.class</code>*/@SuppressWarnings("rawtypes")public static Class getMethodGenericReturnType(Method method) {  return getMethodGenericReturnType(method, 0);  }/**** 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer> maps, List<String> names) {}* @param method*          method 方法 * @param index*          第几个输入参数* @return*          输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,则直接返回空集合*/@SuppressWarnings("rawtypes")public static List<Class> getMethodGenericParameterTypes(Method method, int index) {  List<Class> results = new ArrayList<Class>();  Type[] genericParameterTypes = method.getGenericParameterTypes();  if (index >= genericParameterTypes.length || index < 0) {  throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));  }  Type genericParameterType = genericParameterTypes[index];  if (genericParameterType instanceof ParameterizedType) {  ParameterizedType aType = (ParameterizedType) genericParameterType;  Type[] parameterArgTypes = aType.getActualTypeArguments();  for (Type parameterArgType : parameterArgTypes) {  Class parameterArgClass = (Class) parameterArgType;  results.add(parameterArgClass);  }  return results;  }  return results;  }/**** 通过反射,获得方法输入参数第index个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer> maps, List<String> names) {}* @param method*           method 方法 * @return*           输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,则直接返回空集合*/@SuppressWarnings("rawtypes")public static List<Class> getMethodGenericParameterTypes(Method method) {  return getMethodGenericParameterTypes(method, 0);  }/**** 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names; * @param field*             field 字段* @param index*            泛型参数所在索引,从0开始。* @return*            泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,则直接返回<code>Object.class</code>*/public static Class getFieldGenericType(Field field, int index) {  Type genericFieldType = field.getGenericType();  if (genericFieldType instanceof ParameterizedType) {  ParameterizedType aType = (ParameterizedType) genericFieldType;  Type[] fieldArgTypes = aType.getActualTypeArguments();  if (index >= fieldArgTypes.length || index < 0) {  throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));  }  return (Class) fieldArgTypes[index];  }  return Object.class;  }/**** 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names; * @param field*          field 字段* @return*             泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,则直接返回<code>Object.class</code>*/public static Class getFieldGenericType(Field field) {  return getFieldGenericType(field, 0);  }/**** 根据实体得到实体的所有属性* @param objClass* @return* @throws ClassNotFoundException*/public static String[] getColumnNames(String objClass) throws ClassNotFoundException {  String[] wageStrArray = null;  if (objClass != null) {  Class class1 = Class.forName(objClass);  Field[] field = class1.getDeclaredFields();// 这里便是获得实体Bean中所有属性的方法  StringBuffer sb = new StringBuffer();  for (int i = 0; i < field.length; i++) {// 这里不多说了  sb.append(field[i].getName());  // 这是分割符 是为了去掉最后那个逗号  // 比如 如果不去最后那个逗号 最后打印出来的结果是 "id,name,"  // 去了以后打印出来的是 "id,name"  if (i < field.length - 1) {  sb.append(",");  }  }  // split(",");这是根据逗号来切割字符串使字符串变成一个数组  wageStrArray = sb.toString().split(",");  return wageStrArray;  } else {  return wageStrArray;  }  }public static Object[] field2Value(Field[] f, Object o) throws Exception {  Object[] value = new Object[f.length];  for (int i = 0; i < f.length; i++) {  value[i] = f[i].get(o);  }  return value;  }//   public HttpSession getSession() {
//        HttpSession session=null;
//        ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
//        HttpSession contextSess = attr == null ? session : attr.getRequest().getSession(true);
//        return contextSess;
//    }/**** 得到实体类* @param objClass*           实体类包含包名* @return*/public static  Class getEntityClass(String objClass) {Class entityClass = null;  try {  entityClass = Class.forName(objClass);  } catch (ClassNotFoundException e) {              e.printStackTrace();  }   return entityClass;  }/**** 生成指定长度的随机密码* @param passLength*           随机密码的长度* @return*          返回生成的随机密码字符串*/public static String getPasswords(int passLength) {   String passwords = "";// 新建一个长度为指定需要密码个数的字符串数组   Random random = new Random();   StringBuilder password = new StringBuilder("");// 保存生成密码的变量   for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码   password.append(chars[random.nextInt(62)]);// 为密码变量随机增加上面字符中的一个   }   passwords = password.toString();// 将生成出来的密码赋值给密码数组   return passwords;   }
}

Java实现泛型解析工具类-GenericsUtils相关推荐

  1. Java学习day18-集合框架2(泛型,工具类,TreeMap)

    集合框架2 今日目标 一.泛型 1.泛型类 2.泛型接口 3.泛型方法 4.泛型通配符 二.集合工具类 三.TreeMap和TreeSet 作业: 今日目标 泛型 集合工具类 自带排序集合 一.泛型 ...

  2. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  3. java解析mdb文件_Access MDB文件解析查询,Access数据库解析工具类MdbUtils

    Access MDB文件解析查询,Access数据库解析工具类MdbUtils ================================ ©Copyright 蕃薯耀 2018年9月18日 h ...

  4. Java XML解析工具类

    Java XML解析工具类 Java解析XML的方式有很多,这里不一一说明了,利用三方jar包,实现了一个XML工具类 本身是有个需求,讲三方公司的XML请求文件中的Response里的属性赋值成ja ...

  5. [Android开发] Json解析工具类,一个类搞定Json的解析

    一.简介 利用递归的方式反射解析到bean里面 二.详细代码 1. Json格式 例如服务器指定规定json格式为: {"code": "--" , // 返回 ...

  6. 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)

    Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...

  7. java中常用的工具类

    1. 常用零散工具类 1.1[DateUtil.java]日期处理的工具类 /*** 时间日期处理工具* String -> Date* Date -> String* 以及生成含有日期的 ...

  8. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  9. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  10. 【Java 代码实例 13】Java操作pdf的工具类itext

    目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...

最新文章

  1. 人工智能和机器学习领域有哪些有趣的开源项目
  2. [python]目录及文件操作
  3. 【复杂网络】图模型在欺诈检测应用一点看法
  4. 领域应用 | 智能导购?你只看到了阿里知识图谱冰山一角
  5. CentOS 7下彻底卸载MySQL数据库
  6. mysql断了导致rabbitmq挂了,rabbitmq 消费线程无故中断连接
  7. SAP License:FICO重要概念(二)-附常用技巧
  8. Mac电脑的12个神奇隐藏功能
  9. 【洛谷 1027】双重回文数
  10. 基于NFC的Android读写软件,NFC读写(android代码)
  11. MySQL电影院管理系统_电影院售票管理系统
  12. Python——免费观看全网视频小程序
  13. PSV 3.60 固化升级到 3.68 破解完全攻略
  14. 网络策略(networkpolicy随笔记)
  15. 全国关于省市区/县的行政区划数据-数据来源国家统计局
  16. FPGA引脚功能说明与分析
  17. 2017-12-9框架
  18. 开关电源的缓启动Soft Start
  19. Compound word transformer代码详解(一)数据预处理
  20. 中年危机,职场危机;未雨绸缪

热门文章

  1. 研发流程——变更流程管控
  2. Codeforces Beta Round #94 (Div. 1 Only)A. Statues
  3. ORA-1653: unable to extend table by 1024 in tablespace(oracle表空间满了的解决方案)
  4. 【笔记】用python计算BS模型、隐波的笔记
  5. c# 抓取数据的3种方法
  6. 南京邮电大学汇编——实验一:汇编语言语法练习与代码转换
  7. 大O记法-BigO notation
  8. cordova media插件
  9. 人员-组织 结构 数据库关系设计
  10. 【js获取当天时间0点和23点59分59秒】