前一阵在做一个功能的时候,要通过反射去取List的范型定义,所以研究了一下java范型的整个模型,现在总结一下,免得以后忘掉。
大家都说Java范型是编译器层面的实现,运行时拿不到范型类。就这句话,我的理解就是,通过对象实例,你是拿不到其范型相关信息,而记录在字节码里的,也就是类上的,方法上的,类变量上的还是可以拿到的。比如某个类中的代码
//这里Alist的超类限制了是只能放String的范型
//这个范型信息可以通过Alist.class来获取
public class AList extends ArrayList<String> {
public void Test() {
//这个list实例的范型定义应该是只能放String
//但这个信息是仅仅依靠list这个实例引用是取不到的
List<String> list = new ArrayList<String>()
}
}
java范型的根对象是java.lang.reflect.Type接口该接口没有任何方法,仅仅是一个标志性的接口,所有的范型信息(也就是<>中定义的东西)都是可以上溯到该接口。
该接口下有四类子接口和一实现类,实现类就是Class类,而接口包括:
GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
妈的,这几个名字可够拗口的。其中TypeVariable<D>和其他三种接口类型有一定的明显区别,虽然他们都是用来定义<>中的东东。
说到TypeVariable<D>就不得不提起java范型中另一个比较重要的接口对象,java.lang.reflect.GenericDeclaration接口对象。该接口用来定义哪些对象上是可以声明范型变量,所谓范型变量就是<E extends List>或者<E>, 也就是TypeVariable<D>这个接口的对应的对象,TypeVariable<D>中的D是extends GenericDeclaration的,用来通过范型变量反向获取拥有这个变量的GenericDeclaration
目前实现GenericDeclaration接口的类包括Class, Method, Constructor,也就是只能在这几种对象上进行范型变量的声明。GenericDeclaration的接口方法getTypeParameters用来逐个获取该GenericDeclaration的范型变量声明。
比如:
public class ClassA <K extends List & Serializable, V> {
}
类ClassA上就有两个TypeVariable<D>可以通过ClassA.class.getTypeParameters()[0]来获取第一个范型变量"K extends List"的信息。从而更进一步拿到变量名字,变量上界,变量所在的GenericDeclaration对象。
//获取范型变量定义
TypeVariable t = ClassA.class.getTypeParameters()[0];
t.getName();//获取变量名字,返回K
t.getGenericDeclaration();//获取变量被定义在什么GenericDeclaration上,这里返回ClassA.class
t.getBounds()[0];//变量上边界数组,这里返回List.class
t.getBounds()[1];//变量上边界数组,这里返回Serializable.class
//当然可以获取第二个变量定义
t = ClassA.class.getTypeParameters()[1];
t.getName();//返回V
t.getGenericDeclaration();//获取变量被定义在什么GenericDeclaration上,这里返回ClassA.class
t.getBounds()[0];//变量上边界数组,这里返回Object.class,并且上边界只有一个
分享到:
相关推荐
### 分布式系统原理与范型...以上是对《分布式系统原理与范型--(第二版)》中第一章和第二章内容的知识点总结。通过这些内容的学习,可以更好地理解分布式系统的组成、原理及其关键特性,为后续深入研究打下坚实的基础。
1. 范型的基本概念 - 类型参数:在定义类、接口或方法时,使用尖括号()内的字母(如T, E, K, V等)表示类型参数,代表一种未知的类型。 - 泛型类:带有类型参数的类,例如`ArrayList<T>`,其中T就是类型参数。 ...
本文提出的基于消息传递范型和客户机/服务器(Client/Server,简称C/S)范型双范型的主数据管理机制,能够有效解决MDM面临的问题。 消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型...
华中科技大学 分布式系统原理与范型_考试_2009_答案
《C++多范型设计》是一本深入探讨C++编程语言中模板技术的专著,由知名软件工程师James O. Coplien撰写,并由鄢爱兰、周辉等翻译成中文版,ISBN号为9787508318240。这本书的核心主题是C++中的泛型编程,它是C++编程...
《七周七语言:理解多种编程范型》共介绍了七种不同的编程语言。对于每种语言,分别介绍了各自的特性、应用,以及编程入门知识和关键编程范型,还带领读者使用能够代表该语言最重要特性的技术,解决某个不寻常的问题...
分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版)
1. 容器(Containers):如vector、list、set、map等,它们提供了存储和组织数据的结构。每个容器都有其特定的特性,比如vector是动态数组,而list是双向链表。容器内部使用了动态内存管理,可以方便地添加、删除和...
第2~9章讨论的是分布式系统的的原理、概念和技术,包括通信、进程、命名、同步化、一致性和复制、容错性以及安全性等,而分布式应用的开发方法(即范型)在第10~13章中进行了讨论。但是,与前一版不同的是,我们...
1. **强大的底层架构**:基于成熟的 STL 体系,提供高效的数据处理能力。 2. **泛型支持**:允许存储多种数据类型,如整数、字符串、浮点数等,甚至包括自定义对象。 3. **数组常量功能**:利用 Delphi 4 引入的 `...
在具体章节构成上,《分布式系统原理与范型》主要由两大部分内容组成:第一部分讨论了分布式系统的基本原理和关键技术,由第1章至第7章组成;第二部分则着重于分布式系统的实际应用范例,从第9章至第12章展开。这样...
分布式系统原理与范型中的命名系统是构建大规模网络服务的核心组成部分。命名系统允许在分布式环境中对资源进行标识、定位和访问。在这个系统中,"命名"是指为系统内的实体分配一个标识符,使得这些实体可以被其他...
1. **基本概念**: - **分布式系统**:由多台独立的计算节点通过网络通信,共享资源,协同完成任务的系统。 - **节点**:分布式系统中的每个计算设备,可以是服务器、工作站或嵌入式设备。 - **全局视图与局部...
1. 客户端-服务器(Client-Server)模型:这是最常见的范型,客户端向服务器发送请求,服务器处理并返回结果。这种模型适用于负载较小,对响应时间要求不高的场景。 2. 对等网络(Peer-to-Peer, P2P):在P2P网络中...
《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...
在分析信息化进程中的软件范型演绎与智能体,我们首先需要了解软件范型这一概念。软件范型,指的是软件开发中采用的抽象模型和方法论,它反映了软件开发的一种哲学思考和理念。随着信息化进程中面临的主要问题的变化...
Java 范型Java 范型
1. **分布式系统定义**:分布式系统是由多个相互协作的计算实体组成的,这些实体通过网络进行通信,并且对用户呈现出单一、统一的服务。它们在逻辑上被视为一个整体,但在物理上是分散的。 2. **CAP理论**:分布式...
1. 中间件技术 分布式系统通过中间件将异构的硬件和软件资源整合起来,为用户提供单一系统的抽象。中间件位于操作系统和应用程序之间,它允许不同计算机和网络像一个单独系统那样工作。这使得用户和应用程序可以不必...