Java中的Type类型详解,面试阿里P7岗

HarmonyOS学习 2021-11-25 19:18:18
java 面试 编程语言 后端开发

  • getOwnerType(): Type

返回ParameterizedType类型所在的类的Type。如Map.Entry<String, Object>这个参数化类型返回的事Map(因为Map.Entry这个类型所在的类是Map)的类型。

  • getActualTypeArguments(): Type[]

该方法返回参数化类型<>中的实际参数类型, 如 Map<String,Person> map 这个 ParameterizedType 返回的是 String 类,Person 类的全限定类名的 Type Array。注意: 该方法只返回最外层的<>中的类型,无论该<>内有多少个<>。

下面让我们用一段例子来看一下具体的用法:

//是ParameterizedType
private HashMap<String, Object> map;
private HashSet<String> set;
private List<String> list;
private Class<?> clz;

//不是ParameterizedType
private Integer i;
private String str;

private static void printParameterizedType(){
Field[] fields = TestParameterizedTypeBean.class.getDeclaredFields();
for (Field f : fields){
//打印是否是ParameterizedType类型
System.out.println("FieldName: " + f.getName() + " instanceof ParameterizedType is : " +
(f.getGenericType() instanceof ParameterizedType));
}
//取map这个类型中的实际参数类型的数组
getParameterizedTypeWithName(“map”);
getParameterizedTypeWithName(“str”);
}

private static void getParameterizedTypeWithName(String name){
Field f;
try {
//利用反射得到TestParameterizedTypeBean类中的所有变量
f = TestParameterizedTypeBean.class.getDeclaredField(name);
f.setAccessible(true);
Type type = f.getGenericType();
if (type instanceof ParameterizedType){
for(Type param : ((ParameterizedType)type).getActualTypeArguments()){
//打印实际参数类型
System.out.println(“—type actualType—” + param.toString());
}
//打印所在的父类的类型
System.out.println(“—type ownerType0—”+ ((ParameterizedType) type).getOwnerType());
//打印其本身的类型
System.out.println(“—type rawType—”+ ((ParameterizedType) type).getRawType());
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}

上面的代码主要是定义了一些变量,这些变量中间有ParameterizedType也有普通类型变量,我们来看一下上述代码的输出:

Java中的Type类型详解,面试阿里P7岗_后端开发

  • TypeVariable:类型变量

范型信息在编译时会被转换为一个特定的类型, 而TypeVariable就是用来反映在JVM编译该泛型前的信息。(通俗的来说,TypeVariable就是我们常用的T,K这种泛型变量)

  • getBounds(): Type[]:

返回当前类型的上边界,如果没有指定上边界,则默认为Object。

  • getName(): String:

返回当前类型的类名

  • getGenericDeclaration(): D

返回当前类型所在的类的Type。

下面通过一个例子来加深了解:

public class

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

TestTypeVariableBean<K extends Number, T> {

//K有指定了上边界Number
K key;
//T没有指定上边界,其默认上边界为Object
T value;

public static void main(String[] args){
Type[] types = TestTypeVariableBean.class.getTypeParameters();
for (Type type : types){
TypeVariable t = (TypeVariable) type;
int index = t.getBounds().length - 1;
//输出上边界
System.out.println(“–getBounds()-- " + t.getBounds()[index]);
//输出名称
System.out.println(”–getName()–" + t.getName());
//输出所在的类的类型
System.out.println(“–getGenericDeclaration()–” + t.getGenericDeclaration());
}
}
}

再来看下输出:

Java中的Type类型详解,面试阿里P7岗_面试_02

  • GenericArrayType:泛型数组类型:

组成数组的元素中有泛型则实现了该接口; 它的组成元素是 ParameterizedType 或 TypeVariable 类型。(通俗来说,就是由参数类型组成的数组。如果仅仅是参数化类型,则不能称为泛型数组,而是参数化类型)。注意:无论从左向右有几个[]并列,这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。

  • getGenericComponentType(): Type:

返回组成泛型数组的实际参数化类型,如List[] 则返回 List。

下面还是通过一个例子来深入了解:

public class TestGenericArrayTypeBean<T> {

//泛型数组类型
private T[] value;
private List<String>[] list;

//不是泛型数组类型
private List<String> singleList;
private T singleValue;

public static void main(String[] args){
Field[] fields = TestGenericArrayTypeBean.class.getDeclaredFields();
for (Field field: fields){
field.setAccessible(true);
//输出当前变量是否为GenericArrayType类型
System.out.println("Field: "

  • field.getName()
  • “; instanceof GenericArrayType”
  • ": "
  • (field.getGenericType() instanceof GenericArrayType));
    if (field.getGenericType() instanceof GenericArrayType){
    //如果是GenericArrayType,则输出当前泛型类型
    System.out.println("Field: "
  • field.getName()
  • “; getGenericComponentType()”
  • ": "
  • (((GenericArrayType) field.getGenericType()).getGenericComponentType()));
    }
    }
    }
    }

接下来看下输出:

Java中的Type类型详解,面试阿里P7岗_Java_03

  • WildcardType: 通配符类型

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

本文已被 CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

版权声明
本文为[HarmonyOS学习]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15438507/4690528

  1. Fonction de flèche JavaScript
  2. JavaScript - déconstruction assignations
  3. Building CentOS 7.6 with Linux
  4. JavaScript - type d'emballage
  5. linux deepin/ubuntu安装flameshot火焰截图
  6. JavaScript - encapsulation et héritage (deux)
  7. JavaScript JS method for writing 99 multiplication table
  8. 從零開始學java - 第二十五天
  9. Apprendre Java à partir de zéro - jour 25
  10. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  11. JavaScript - ceci pointe vers le problème
  12. Copie JavaScript
  13. Spring boot quickly integrates swagger
  14. linux deepin/ubuntu安裝flameshot火焰截圖
  15. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  16. Jquery DOM et jquery, fonctions d'entrée (bases)
  17. Méthode d'instance jquery
  18. Méthode et démonstration de code dans l'interface de liste en Java
  19. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  20. Démarrage du Zookeeper
  21. Java oom Cognition
  22. Java 开发者最困惑的四件事,值得一看!,BAT面试文档
  23. Java 将两个对象list里面的 某个字段值抽取到一个list里,java选择排序原理
  24. Java 多线程 —— 生产者消费者问题,从基础到深入案例
  25. Java 中设计模式 之 工厂模式,java反射机制的底层原理
  26. 【錯誤記錄】Java 中 ArrayList 排序 ( 使用 Comparator 接口時注意 compare 返回值是 -1 和 +1 )
  27. 【 enregistrement des erreurs 】 tri ArrayList en Java (Notez que les valeurs de retour de comparaison sont - 1 et + 1 lors de l'utilisation de l'interface de comparaison)
  28. Pourquoi Xiaopeng P5 est - il devenu un grand succès dans le cercle? Le Salon de l'automobile de Guangzhou montre encore des compétences polyvalentes
  29. Java 開發者最困惑的四件事,值得一看!,BAT面試文檔
  30. Les quatre choses les plus déroutantes pour les développeurs Java valent la peine d'être regardées! Document d'entrevue sur les MTD
  31. k8s-Pod污点与容忍
  32. k8s-Pod污点与容忍
  33. K8s POD Contamination and Tolerance
  34. K8s POD Contamination and Tolerance
  35. mysql常用语句——GROUP BY和HAVING
  36. Spring boot quickly integrates swagger
  37. mysql常用語句——GROUP BY和HAVING
  38. MySQL Common statements - group by and having
  39. Le défi du pinceau leetcode - Javascript: 110. Arbre binaire équilibré
  40. [notes d'apprentissage de première ligne] day44: XMLHttpRequest
  41. java调用RFC延长调用时间
  42. java調用RFC延長調用時間
  43. Java call RFC prolonge le temps d'appel
  44. Le modèle d'usine du modèle de conception en Java, le principe sous - jacent du mécanisme de réflexion Java
  45. Java Multithreading - producer Consumer issues, From Basic to Deep case
  46. OushuDB 安装与升级之安装 HDFS
  47. OushuDB 安装与升级之安装 Zookeeper
  48. Java-String-对象,你真的了解了吗?,mysql教程入门到精通
  49. Linux引导过程与服务控制
  50. Java-8新特性:学习如何使用Lambda表达式(一,线程池的实现原理
  51. Java 读写锁 ReentrantReadWriteLock 源码分析,headfirstjavapdf百度云
  52. JAVA 获取系统日期时间,初级java开发常见的面试题
  53. MySQL judges the salary changes based on the existing data
  54. k8s-Pod污點與容忍
  55. Java extrait une valeur de champ de deux listes d'objets dans une liste, et Java sélectionne le principe de tri
  56. java中ArrayList应用实例,阿里巴巴java面试流程
  57. Java个人技术知识点总结(框架篇),kafka聊天服务器架构
  58. JavaWeb快速入门--Servlet(2),java程序设计精编教程第三版上机实践
  59. JavaWeb - 文件的上传,核心API的使用,文件下载,附学习笔记 面试整理 进阶书籍
  60. Netty原理:pipeline