`
xuji
  • 浏览: 11444 次
社区版块
存档分类
最新评论

java 反射 泛型机制 获得泛型的实际类型(二)

阅读更多
  
   二、 ParameterizedType 参数化的类型,顾名思义,就是给一个类型传递了类型参数,例 List<Contract>  List接口被传递了Contract类型参数,那么类型List<Contract>就是ParameterizedType,它可以做属性的类型,做方法参数或返回值的类型,也可以做泛型声明的上边界。 例如 public class GenericClass<T extends List<Contract>>里的List<Contract>。由于泛型声明可以声明多个泛型参数,所以,参数化的类型也可以传入多个类型参数,多个类型参数用,隔开。例如著名的Map定义的泛型参数是K和V 可以传入Map<String,Contract>等等.如果属性或方法参数声明的数据给类型传递了类型参数,则field.getGenericType method.getGenericParameterType返回Type 就是 instanceof ParameterizedType. ptype.getActualTypeArguments() :Type[]返回每个传入的类型参数,返回值的长度取决于泛型声明时声明了几个形式泛型参数。本文提出的问题便是基于这一点来尝试解决的。ptype.getRawType() type返回的是<>外的类型 即接收类型参数的类型,如List,Map.
  
   三、WildcardType 这种类型用来处理参数化类型里,对类型参数范围的描述。例如一个方法的泛型参数是 Map<? extends Number,? super Contract>,此时 <> 里用逗号隔开两个对象都是WildcardType的实例。对每一个WildcardType对象(验证type instanceof WildcardType==true) wtype.getUpperBounds():Type[]返回上边界类型(默认是Object.class),wtype.getLowerBounds():Type[]返回下边界类型。

  说了这么多,逻辑太绕了,本来就很难说清楚。只有多测试多使用才能体会到。下面给一个我写的方法,这个方法用来访问一个Collection接口类型的Field,假定该Field使用了泛型,然后返回Collection的类型参数具体是什么,即返回客户类指定的集合元素的类型。注意,的确只能在运行时才能确定具体类型,本方法只能获得泛型的边界,然后用上边界类型来构造对象。如果一个使用了泛型的属性刚好就像List<Contract>一样,那么读取到Contract.class是轻而易举的,因为这个泛型参数的边界是固定的。
   public Class getGenericTypeBounds(Field field)
throws TypeResolveException{
Type type = field.getGenericType();
if(type instanceof Class){
throw new TypeResolveException(field.getDeclaringClass().getName()+"属性"
+field.getName()+" 没有使用泛型或者 使用了rawtype但是没有指定泛型实参。");
}
else if(type instanceof GenericArrayType){
type = ((GenericArrayType)type).getGenericComponentType();
}
else if(type instanceof TypeVariable<?>){
type = ((TypeVariable<?>)type).getBounds()[0];
}
else if(type instanceof ParameterizedType){
ParameterizedType ptype = (ParameterizedType)type;
Type[] types = ptype.getActualTypeArguments();
if(types==null || types.length==0){
throw new TypeResolveException(field.getDeclaringClass().getName()+"的集合属性"
+field.getName()+" 所引用的泛型类型没有指定泛型实参取值。");
}
if(types.length>1){
throw new TypeResolveException(field.getDeclaringClass().getName()+"的集合属性"
+field.getName()+" 所引用的泛型类型 指定的泛型实参取值多于1个。");
}
type = ptype.getActualTypeArguments()[0];//只有这个方法的返回值才可能是  WildcardType
}
while(!(type instanceof Class)){
if(type instanceof WildcardType){
type = ((WildcardType)type).getUpperBounds()[0];
}
else if(type instanceof TypeVariable<?>){
type = ((TypeVariable<?>)type).getBounds()[0];
}
else if(type instanceof ParameterizedType){
ParameterizedType ptype = (ParameterizedType)type;
Type[] types = ptype.getActualTypeArguments();
if(types==null||types.length==0){
return Object.class;
}
if(types.length>1){
throw new TypeResolveException(field.getDeclaringClass().getName()+"的集合属性"
+field.getName()+"引用到的泛型"+ptype+"的实参数量多于1个");
}
type = ptype.getActualTypeArguments()[0];
}
else if(type instanceof GenericArrayType ){
type = ((GenericArrayType)type).getGenericComponentType();
}
}
return (Class)type;
}
  
 
  

  
1
0
分享到:
评论

相关推荐

    Java反射泛型,实现数据库的动态增删改查等功能

    Java反射和泛型是两种强大的编程特性,它们在开发中有着广泛的应用,特别是在数据库操作的动态化场景下。本文将详细介绍如何结合这两种技术实现在Java中对MySQL、SQL Server或Oracle数据库进行动态的增删改查操作。 ...

    java泛型和反射机制

    对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握

    java 基于泛型与反射的通用 DAO

    在Java编程语言中,泛型和反射是两个非常重要的特性,它们可以极大地提高代码的复用性和灵活性。本文将深入探讨如何结合这两种技术实现一个通用的DAO(Data Access Object)设计模式。 首先,我们来看“泛型”。...

    Java泛型和反射机制

    Java泛型和反射机制

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    java反射与泛型综合例子

    总结来说,Java反射提供了在运行时探索和操作类的能力,而泛型则增强了类型安全和代码复用。在`Testrefl.java`的例子中,这两者结合在一起,实现了动态创建和操作对象的能力,显示了Java编程的强大灵活性。理解并...

    JAVA5泛型和反射

    总的来说,Java 5 中的泛型和反射这两个特性显著提升了代码的类型安全性和灵活性,同时,反射为解决复杂编程问题提供了新的途径。学习和掌握这两个特性对于深入理解 Java 并编写更高效、安全的代码至关重要。

    Java泛型的用法及T.class的获取过程解析

    Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析。 一、泛型的基本概念 泛型是Java 5中...

    java5泛型新特性 pdf

    Java 5 泛型是Java编程语言中一个重要的里程碑,它引入了类型安全的集合,大大增强了代码的可读性和可维护性。泛型在Java 5中首次亮相,为开发者提供了一种方式来限制集合(如List、Set、Map等)中可以存储的数据...

    利用反射生成泛型类对象

    反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool&lt;Point&gt; pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...

    Java试题-3:反射和泛型的综合应用

    Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术

    Java基础入门四泛型反射注解.pdf

    在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...

    Java-Java反射与泛型教程

    Java反射与泛型是Java编程中的两个重要特性,它们各自为开发者提供了强大的工具来增强代码的灵活性和类型安全性。在本教程中,我们将深入探讨这两个主题,帮助你更好地理解和运用它们。 **Java反射** Java反射机制...

    反射泛型

    在Java编程语言中,反射和泛型是两个非常重要的特性,它们极大地增强了代码的灵活性和类型安全性。本文将深入探讨这两个概念以及它们之间的关联。 **反射** 是Java提供的一种强大的工具,允许我们在运行时检查和...

    反射泛型完美版分页.rar

    总的来说,"反射泛型完美版分页.rar"提供的解决方案结合了Java的两种强大特性,旨在提供一个高效、灵活且类型安全的分页工具,对于处理大数据量的应用场景尤其有价值。不过,需要注意的是,过度使用反射可能会导致...

    Java泛型应用实例

    配合博主的博客文章,你可以更深入地了解泛型在实际项目中的应用,包括但不限于类型安全的容器、泛型与反射的交互、以及泛型在并发编程中的作用等。通过实践这些实例,你将能够更好地掌握Java泛型的精髓,提高编程...

    java泛型的内部原理及更深应用

    6. **类型推断**:Java 7引入了类型推断机制,简化了泛型的使用。例如,使用`&lt;&gt;`钻石操作符,如`List&lt;String&gt; list = new ArrayList();`,编译器会自动推断出列表的类型。 7. **泛型方法**:除了泛型类,我们还可以...

    Java泛型_Java中的泛型结构_

    Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。泛型的主要目标是提高代码的类型安全性和重用性,减少类型转换的麻烦,并在编译时捕获可能的类型错误。...

Global site tag (gtag.js) - Google Analytics