GenericsUtils.rar

  • qingmenglunhui
    了解作者
  • Java
    开发工具
  • 1KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2019-12-12 11:56
    上传日期
泛型工具类,通过反射,获得指定类的父类的泛型参数的实际类型
GenericsUtils.rar
  • GenericsUtils.java
    6.7KB
内容介绍
package com.jzr.serp.commons; 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; public class GenericsUtils { /** * 泛型工具类 */ /** * 通过反射,获得指定类的父类的泛型参数的实际类型. 如DaoSupport<Buyer> * * @param clazz * clazz 需要反射的类,该类必须继承范型父类 * @param index * 泛型参数所在索引,从0开始. * @return 范型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 * <code>Object.class</code> */ public static Class<?> getSuperClassGenricType(Class<?> clazz, int index) { Type genType = clazz.getGenericSuperclass();// 得到泛型父类 // 如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.class if (!(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]; } /** * 通过反射,获得指定类的父类的第一个泛型参数的实际类型. 如DaoSupport<Buyer> * * @param clazz * clazz 需要反射的类,该类必须继承泛型父类 * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 * <code>Object.class</code> */ public static Class<?> getSuperClassGenricType(Class<?> clazz) { return getSuperClassGenricType(clazz, 0); } /** * 通过反射,获得方法返回值泛型参数的实际类型. 如: public Map<String, Buyer> getNames(){} * * @param Method * method 方法 * @param int index 泛型参数所在索引,从0开始. * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 * <code>Object.class</code> */ 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> */ 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 int index 第几个输入参数 * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合 */ 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; } /** * 通过反射,获得方法输入参数第一个输入参数的所有泛型参数的实际类型. 如: public void add(Map<String, Buyer> * maps, List<String> names){} * * @param Method * method 方法 * @return 输入参数的泛型参数的实际类型集合, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回空集合 */ public static List<Class<?>> getMethodGenericParameterTypes(Method method) { return getMethodGenericParameterTypes(method, 0); } /** * 通过反射,获得Field泛型参数的实际类型. 如: public Map<String, Buyer> names; * * @param Field * field 字段 * @param int 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 字段 * @param int index 泛型参数所在索引,从0开始. * @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回 * <code>Object.class</code> */ public static Class<?> getFieldGenericType(Field field) { return getFieldGenericType(field, 0); } }
评论
    相关推荐
    • 键盘测试工具
      网吧,还有家庭,平时键盘都无法按出某个键,在这种情况下,都需要去检查接口和键盘是否坏掉,该工具可以直接执行,插上键盘,运行工具,键盘所有按键按一次,工具会自动标示出那个按键有问题!网吧经典工具
    • SNMP读取工具
      SNMP测试工具,方便好用,体积小。使用广泛,人见人爱。是测试工程师和对接交换机设备的备用工具,指得推荐。
    • 电科院测试工具
      本测试工具可以作为模拟测试工具,是电科院弄出来的测试工具
    • 远程工具
      远程工具远程工具远程工具远程工具远程工具远程工具
    • Xpath测试工具
      Xpath测试工具,下载解压直接使用,复制内容到工具内,编写规则测试即可
    • 网页开发工具
      FSCapture是现在比较适用的截图工具了 非常易用 工具虽小但功能强大,免费录屏软件
    • OPCClientOPC测试工具
      一个测试OPCsever的工具,小巧玲珑,使用方便。一个测试OPCsever的工具,小巧玲珑,使用方便。OPCclient
    • socket测试工具
      SocketTool(很好用的socket测试工具)SocketTool(很好用的socket测试工具)SocketTool(很好用的socket测试工具)SocketTool(很好用的socket测试工具)SocketTool(很好用的socket测试工具)SocketTool(很好用的socket测试...
    • wap开发工具
      wap手机网页开发工具包,里面有3个wap开发工具。可以可视化开发。 wap手机网页开发工具包,里面有3个wap开发工具。可以可视化开发。
    • asp测试工具
      asp测试工具,解压后,直接把这个asp测试工具.exe放到你的网站程序根目录下就可以了,直接双击运行。