关闭

反射处理java泛型

发表于:2015-3-24 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:破狼    来源:51Testing软件测试网采编

  当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息。这就是本文将要介绍的ReflectionUtil就是为了解决这类问题的辅助工具类,为java.lang.reflect标准库的工具类。它提供了便捷的访问泛型对象类型(java.reflect.Type)的反射方法。
  本文假设你已经了解java反射知识,并能熟练的应用。如果还不了解java反射知识,那么你可以先移步到Oracel反射课程,这可能是你开始学习反射的好起点.
  ReflectionUtil中包含以下几种功能:
  通过Type获取对象class;
  通过Type创建对象;
  获取泛型对象的泛型化参数;
  检查对象是否存在默认构造函数;
  获取指定类型中的特定field类型;
  获取指定类型中的特定method返回类型;
  根据字符串标示获取枚举常量;
  ReflectionUtil下载地址.
  通过Type获取对象class
private static final String TYPE_NAME_PREFIX = "class ";
public static String getClassName(Type type) {
if (type==null) {
return "";
}
String className = type.toString();
if (className.startsWith(TYPE_NAME_PREFIX)) {
className = className.substring(TYPE_NAME_PREFIX.length());
}
return className;
}
public static Class<?> getClass(Type type)
throws ClassNotFoundException {
String className = getClassName(type);
if (className==null || className.isEmpty()) {
return null;
}
return Class.forName(className);
}
  方法ReflectionUtil#getClass(Type)实现了从java.lang.reflect.Type获取java.lang.Class对象名称。这里利用了Type的toString方法获取所在类型的class。如“class some.package.Foo”,截取后部分class名称,在利用Class.forName(String)获取class对象。
  通过Type创建对象
  public static Object newInstance(Type type)
  throws ClassNotFoundException, InstantiationException, IllegalAccessException {
  Class<?> clazz = getClass(type);
  if (clazz==null) {
  return null;
  }
  return clazz.newInstance();
  }
  方法ReflectionUtil#newInstance(Type type)实现根据Type构造对象实例。在这里输入的Type不能是抽象类、接口、数组类型、以及基础类型、Void否则会发生InstantiationException异常。
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号