java泛型程序设计——反射和泛型

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识;


【1】反射和泛型相关

1.1)现在, Class类是泛型的, 如 String.class 实际上是一个 Class 类的对象(事实上, 是唯一的对象);
1.2)类型参数十分有用, 因为它允许Class 方法的返回类型更加具有针对性。

  • 1.2.1)下面的Class 中的方法就使用了类型参数:
    这里写图片描述

对上述语句的分析(Analysis):

  • A1)newInstance 方法: 它返回一个实例, 这个实例所属的类由默认的 构造器获得, 它的返回类型目前被声明为 T, 其类型与 Class 描述的类相同, 这样就免除了类型转换;
  • A2)如果给定的类型确实是T的一个子类型, cast 方法就会返回一个 现在声明为 类型T的对象, 否则, 抛出一个 BadCastException 异常;
  • A3)如果这个类不是 enum 类或类型T 的枚举值的数组, getEnumConstants 方法将返回 null;
  • A4)最后, getConstructor 与 getDeclaredConstructor 方法返回一个 Constructor 对象。 Construtor 类也已经变成 泛型, 以便 newInstance 方法有一个正确的 返回类型;

【2】使用 Class 参数进行类型匹配

2.1)有时, 匹配泛型方法中的Class 参数的类型变量很有使用价值。 看个荔枝(据说比较权威)

public static <T> Pair<T> makePair(Class<T> c) throws InstantiationException , IllegalAccessException
{return new Pair<>(c.newInstance (), c.newInstance());
}
  • 2.1.1)如果调用 makePair(Employee.class)
  • 2.1.2)Employee.class 是类型 Class< Employee> 的一个对象。 makePair 方法的类型参数T 同 Employee 匹配, 并且编译器可以推断出这个方法将返回一个 Pair< Employee>;

【3】虚拟机中的泛型类型消息

3.1)java泛型的卓越特性之一是在虚拟机中 泛型类型的擦除;

  • 3.1.1)如 原始的 Pair类知道源于泛型类 Pair< T> , 即使一个 Pair类型的对象无法区分是由 Pair< String> 构造的还是由 Pair< Employee> 构造的;
  • 3.1.2)类似的, 看一下方法
public static Comparable min(Comparable[] a) , 这是一个方法的擦除 public static <T extends Comparable<? super T>> T min(T[] a);

3.2)可以用反射API类确定:

  • 3.2.1)这个泛型方法有一个叫做T的类型参数;
  • 3.2.2)这个类型参数有一个子类型限定, 其自身又是一个泛型类型;
  • 3.2.3)这个限定类型有一个通配符参数;
  • 3.2.4)这个通配符参数有一个 超类型限定;
  • 3.2.5)这个泛型方法有一个泛型数组参数;

Conclusion) 一句话, 需要重新构造实现者声明的泛型类以及方法中的所有内容。 但是, 不会知道对于特定的对象或方法调用,如何解释类型参数;
3.3) 为了表达泛型类型声明, java SE 5.0 在 java.lang.reflect 包中提供了一个新的接口 Type, 该接口有如下子类:

  • 3.3.1)Class 类:描述具体类型;
  • 3.3.2)TypeVariable接口: 描述类型变量(如 T extends Comparable< ? super T>);
  • 3.3.3)WildcardType接口:描述通配符(如? super T);
  • 3.3.4)ParameterizedType 接口:描述泛型类或接口类型;(如 Comparable< ? super T>);
  • 3.3.5)GenericArrayType 接口: 描述泛型数组(如 T[]);
    这里写图片描述

3.4)看个荔枝:(使用 泛型反射API 打印出给定类的有关内容), 如果用Pair类运行, 将会得到如下报告:

Attention)源代码参见: https://github.com/pacosonTang/core-java-volume/blob/master/chapter12/GenericReflectionTest.java
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka异步发送数据_在Kafka上异步发送数据

kafka异步发送数据对于一个项目&#xff0c;我试图记录用户的基本交易&#xff0c;例如添加和删除一个项目以及多种类型的项目&#xff0c;并为每笔交易向kafka发送一条消息。 日志机制的准确性不是至关重要的&#xff0c;在kafka服务器停机的情况下&#xff0c;我不希望它阻止…

java按钮权限控制_详解Spring Security 中的四种权限控制方式

Spring Security 中对于权限控制默认已经提供了很多了&#xff0c;但是&#xff0c;一个优秀的框架必须具备良好的扩展性&#xff0c;恰好&#xff0c;Spring Security 的扩展性就非常棒&#xff0c;我们既可以使用 Spring Security 提供的方式做授权&#xff0c;也可以自定义授…

aws 数据库迁移_AWS Loft的数据库周

aws 数据库迁移这是我的笔记&#xff1a; https://databaseweekoctober2019sf.splashthat.com AWS上的数据库&#xff1a;合适工作的合适工具 在许多此类谈话中&#xff0c;我并没有做过深刻的记录。 我正在关注重点。 PostgreSQL排在MySQL之后。 AWS上8种类型的数据库&…

java异常——异常分类+声明已检查异常+如何抛出异常+自定义异常类

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常——异常分类声明已检查异常如何抛出异常自定义异常类 的相关知识&#xff1b; 0.2&#xff09;异常处理的任务&#xff1a; 就是将控制权从错误产生的地方转移给能够处…

quarkus_Quarkus入门

quarkusQuarkus – 一个针对OpenJDK HotSpot和GraalVM量身定制的Kubernetes本机Java堆栈&#xff0c;它是从最佳Java库和标准中精制而成的。 –是一个容器优先的框架&#xff0c;针对快速启动时间和低内存消耗进行了优化。 该框架基于许多流行的Java库构建&#xff0c;并且为构…

java异常——捕获异常+再次抛出异常与异常链

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常——捕获异常再次抛出异常与异常链 的相关知识&#xff1b; 【1】捕获异常相关 1.1&#xff09;如果某个异常发生的时候没有再任何地方进行捕获&#xff0c; 那程序就会…

java 类似xamarin_xamarin android如何将Java.Lang.Object类型转成C#类型

问题起源其实这个标题也可以换一个更准确一点&#xff0c;因为我遇到的问题是&#xff1a;xamarin android中的Class继承了Java.Lang.Object &#xff0c;将json序列化成c#类型时发现无法赋值&#xff0c;序列化的格式没问题&#xff0c;但是Class的属性值没有复制成功。xamari…

java异常—— finally 子句+带资源的 try语句

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常—— finally 子句带资源的 try语句 的相关知识&#xff1b; 【1】 finally 子句相关 1.1&#xff09;产生资源回收问题&#xff1a;当代码抛出一个异常时&#xff0c; …

jep290涉及jdk版本_JDK 13中的JEP 355文本块

jep290涉及jdk版本JDK 13已于2019年9月17日上线GA&#xff0c; 此处列出了重要的新功能。 新功能之一是“文本块”。 这样可以轻松地编写多行字符串&#xff0c;而不必在拆分为不同行的同时进行串联。 让我们快速了解创建多行字符串的不同方式&#xff1a; String aBlock &q…

java单例注册表_Java单例模式(Singleton)

单例模式主要用于&#xff1a;有一些对象我们只需要一个&#xff0c;比如&#xff1a;线程池、缓存、对话框、处理偏好设置、注册表对象、日志对象以及配置文件对象、数据库连接对象等等。单例模式常用于管理共享资源&#xff0c;例如&#xff1a;数据库连接或者线程池。Java S…

java异常——分析堆栈跟踪元素+使用异常机制的技巧

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常——分析堆栈跟踪元素使用异常机制的技巧 的相关知识&#xff1b; 【1】分析堆栈跟踪元素相关 1.1&#xff09;堆栈跟踪&#xff1a; 它是一个方法调用过程的列表&#…

jdk8 npe_JDK 14中更好的NPE消息

jdk8 npe我的2019年3月博客文章“ Java会出现更好的默认NullPointerException消息吗&#xff1f; ”的撰写是为了获得更好的NullPointerException消息的JEP 草案尚未针对特定的JDK版本。 此后&#xff0c;该JEP草案成为JEP 14的 目标 JEP 358&#xff08;“ Helpful NullPointe…

开源相册系统Java_基于JAVA的B/S网络相册管理系统

每天记录学习&#xff0c;每天会有好心情。*^_^*今天和一个朋友共同完成了一个网络相册管理系统项目&#xff0c;我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限&#xff0c;只会这个框架&#xff0c;哈哈&#xff0c;都是为了方便他。和往常一样选用简单又便…

java断言——Assertion

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java断言——Assertion 的相关知识&#xff1b; 【1】使用断言 1.1&#xff09;断言机制&#xff1a; 允许在测试期间向代码中插入一些检查语句。 当代码发布时&#xff0c; 这些…

常见的并发模型_两个常见的并发错误

常见的并发模型作为Baeldung的编辑&#xff0c;我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书&#xff0c;但是假设开发人员具有一定的能力。 我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中&#xff0c;并保证为您提供奇怪的结果…

java 哈希一致算法_一致哈希算法Java实现

一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法。传统的Hash算法当槽位(Slot)增减时&#xff0c;面临所有数据重新部署的问题&#xff0c;而一致哈希算法确可以保证&#xff0c;只需要移动K/n份数据(K为数据总量, n为槽位数量)&#xff0c;且只影响…

java日志——基本日志+高级日志

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——基本日志高级日志 的相关知识&#xff1b; 【1】记录日志 1.1&#xff09;出现的问题和解决方法&#xff1a; 1.1.1&#xff09;出现的问题&#xff1a;在我们调试…

java模式匹配_用Java匹配模式

java模式匹配如果您使用的是Java&#xff0c;那么您很有可能以前已经看过它的模式匹配。 String#matches(String)方法在内部使用Pattern类型&#xff0c;该类型包含更复杂的功能&#xff1a; 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配&#xff0c;并且可…

java在frame怎么计时_java – 退出jframe时的Swing stop计时器

我有一个特定的任务,我按计划的时间间隔运行.基本上我在JFrame中的Label上显示相机.但是,当我退出JFrame时,应用程序似乎运行.我怎么能阻止它&#xff1f;我已经删除了代码的细节,只是将相关部分留在了public class TaskCLass extends JFrame {JPanel p;JLabel l;Timer timer;p…

java日志——修改日志管理器配置+日志本地化

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——修改日志管理器配置日志本地化 的相关知识&#xff1b; 【1】修改日志管理器配置 1.1&#xff09;可以通过编辑配置文件来修改日志系统的各种属性。 在默认情况下&a…