`
Tin
  • 浏览: 138381 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

范型擦拭法即范型类无法获取范型参数信息的原因

阅读更多

江南白衣的Blog上一篇:
Java5泛型的用法,T.class的获取和为擦拭法站台
他参考的这里:
Generic Data Access Objects

我们的项目中也用的GenericHibernateDAO,里面使用了一个:

public  GenericHibernateDAO( final  Class < E >  clazz) {
        
this .clazz  =  clazz;
    }

的构造函数。
但是看了江南白衣的介绍,的确方便的可以写成:
public GenericHibernateDAO() {
        
this.clazz = (Class<E>) ((ParameterizedType) getClass()
                                                         .getGenericSuperclass()).getActualTypeArguments()[
0];
    }
这样,继承的子DAO就可以不用写Super(xxx.class)进行构造了。

其中的:
(Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
非常神奇,看了faint的一个回复(请参照白衣的Blog):
package test; 

import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 

import junit.framework.TestCase; 

class TClass<T> { 


class GoodClass<T> extends TClass<String> { 
public ParameterizedType getClassT() { 
return (ParameterizedType) getClass().getGenericSuperclass(); 



class BadClass<T> extends TClass<T> { 
public ParameterizedType getClassT() { 
return (ParameterizedType) getClass().getGenericSuperclass(); 



public class GenericsTest extends TestCase { 

private void print(Type[] targs) { 
System.out.print(
"actual type arguments are:"); 
for (int j = 0; j < targs.length; j++) { 
System.out.print(
" instance of " + targs[j].getClass().getName() + ":"); 
System.out.println(
" (" + targs[j] + ")"); 



public void testGoodClass() throws Exception { 
ParameterizedType type 
= new GoodClass<String>().getClassT(); 
Type[] types 
= type.getActualTypeArguments(); 
print(types); 

assertEquals(TClass.
class, type.getRawType()); 
assertEquals(String.
class, types[0]); 


public void testBadClass() throws Exception { 
ParameterizedType type 
= new BadClass<String>().getClassT(); 
Type[] types 
= type.getActualTypeArguments(); 
print(types); 

assertEquals(TClass.
class, type.getRawType()); 
assertEquals(String.
class, types[0]); 

}
例子中的 BadClass 非常有意思,无法获取T的实际类型,我试验了半天也得不到。
看到也有朋友问这个问题:
http://forum.java.sun.com/thread.jspa?threadID=684429&messageID=3985573

纳闷,怎么就不行呢。
翻了翻候捷的这篇文章:http://www.jjhou.com/javatwo-2004-GP-in-jdk15.pdf
才恍然大悟,原来对于BadClass这种情况就是获取不了它的Class。

这是擦拭法的本意。
实际上BadClass<String>()实例化以后Class里面就不包括T的信息了,对于Class而言T已经被擦拭为Object。而真正的T参数被转到使用T的方法(或者变量声明或者其它使用T的地方)里面(如果没有那就没有存根,这里指ParameterizedTyp),所以无法反射到T的具体类别,也就无法得到T.class。
而getGenericSuperclass()是Generic继承的特例,对于这种情况子类会保存父类的Generic参数类型,返回一个ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。
我们应该利用这种特性,这对实现模版方法非常有用。
分享到:
评论

相关推荐

    C++多范型设计

    C++的范型(Template)是其强大的特性之一,它允许开发者创建泛化的类和函数,这些实体能够在编译时根据不同的类型参数实例化。这使得程序员能够编写出不依赖具体数据类型的通用代码,提升了代码的灵活性和可维护性...

    论文研究-消息传递范型与C/S范型双范型的主数据管理机制 .pdf

    在当今信息产业高速发展的背景下,数据量呈爆炸式增长,企业系统中数据的管理和同步显得尤为重要。在这样的背景下,主数据管理(Master Data Management,简称MDM)成为了解决数据共享、维护数据一致性的关键方法。...

    范型程序设计与 STL.pdf

    范型编程的核心思想是参数化类型,即在编写代码时并不绑定到特定的数据类型,而是使用类型参数。这使得代码能够处理多种数据类型,增强了代码的灵活性和通用性。例如,C++中的模板(templates)就是实现范型编程的...

    《分布式系统原理与范型》.pdf

    《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...

    Java 范型攻略篇

    Java范型的核心概念是参数化类型(Parameterized Types),即允许在类、接口或方法中声明类型参数,从而在使用这些结构时可以指定具体的类型。例如,`ArrayList`在Java 1.5中被重构为`ArrayList&lt;T&gt;`,这里的`T`就是...

    Java 范型Java 范型.doc

    Java 范型Java 范型

    C++多范型设计 作者:[美]James O.Coplien

    书名:C++多范型设计 作者:[美]James O.Coplien 译者: 出版社:中国电力出版社 本书详细地介绍了从“应用领域”到“方案领域”的C++设计实现方法,以及开发者在设计思考和设计实践过程中需要用到的记法、图表和设计...

    分布式系统原理与范型

    《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...

    分布式系统原理与范型(第二版)

    分布式系统原理与范型是IT领域中至关重要的一个主题,特别是在云计算、大数据处理以及现代互联网服务的背景下,理解和掌握分布式系统的概念与实践至关重要。本书作为第二版,深度探讨了这一领域的核心理论和常见模式...

    分布式系统-原理与范型(第2版) 完整版

    第2~9章讨论的是分布式系统的的原理、概念和技术,包括通信、进程、命名、同步化、一致性和复制、容错性以及安全性等,而分布式应用的开发方法(即范型)在第10~13章中进行了讨论。但是,与前一版不同的是,我们...

    分布式系统原理与范型答案(第二版)答案

    分布式系统原理与范型是计算机科学中的一个重要领域,它涵盖了多台计算机如何通过网络协同工作,以实现一个共同的目标。《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式...

    c++多范型设计

    标题中的“C++多范型设计”指的是C++编程语言中的多范型(Multimodality)特性,这是C++的一个关键概念,它允许程序员在不同的抽象级别上编写代码,以适应不同场景的需求。C++的多范型主要包括模板(Templates)、...

    分布式系统原理与范型第二版课后习题答案

    在分布式环境中,事务处理可能因为各种原因被中断,这就要求系统具有故障恢复机制。理论上,事务处理应该是原子性的,即要么完全成功,要么完全不发生。但在某些情况下,比如涉及到物理输入/输出(I/O)的事务,一旦...

    C++多范型设计.pdf

    C++多范型设计.pdfC++多范型设计.pdfC++多范型设计.pdf

    C++ 多范型设计

    本文将深入探讨C++中的多范型设计,主要涉及模板、函数模板、类模板以及模板特化等关键概念。 首先,模板是C++中实现多范型的核心机制。模板定义了一种创建新类型或函数的方式,这些新类型或函数可以在运行时根据...

    一个很好的范型立例题

    - Java范型在编译后会进行类型擦除,实际运行时并不保留类型参数信息,因此在运行时无法通过反射获取泛型类型。 - 擦除后,泛型类的实例将退化为无参数类型,但编译器会检查类型安全。 4. 泛型与多态 - 泛型与...

    分布式系统-原理与范型(第2版)

    分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版)

    分布式系统原理与范型.pdf

    Tanenbaum教授是早期操作系统领域的知名学者,其著作深入浅出地介绍了分布式系统的基本原理和实现范型。 分布式系统的原理部分是该书的核心内容,涵盖了多个重要的概念和原理。首先,通信是分布式系统中最为基本的...

    范型编程与设计模式之应用

    《C++设计新思维:范型编程与设计模式之应用》一书深入剖析了范型编程这一核心概念,以及在C++语言中的具体应用。范型编程,也称为泛型编程,是C++中的一项重要特性,它允许程序员编写不依赖特定数据类型的代码,...

Global site tag (gtag.js) - Google Analytics