Java编程:一步步教你如何深入了解神秘的Java反射机制

前言

  • 在 Java中,反射机制(Reflection)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘

目录

Java编程:一步步带你如何深入了解神秘的Java反射机制


在进入正文之前,顺便给大家推荐一个Java架构方面的交流学习群:725633148,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。相信对于已经工作和遇到技术瓶颈的同学,在这个群里会有你需要的内容。有需要的同学请抓紧时间加入进来。

1. 简介

  • 定义:Java语言中 一种 动态(运行时)访问、检测 & 修改它本身的能力
  • 作用:动态(运行时)获取类的完整结构信息 & 调用对象的方法
  • 类的结构信息包括:变量、方法等
  • 正常情况下,Java类在编译前,就已经被加载到JVM中;而反射机制使得程序运行时还可以动态地去操作类的变量、方法等信息

2. 特点

2.1 优点

灵活性高。因为反射属于动态编译,即只有到运行时才动态创建 &获取对象实例。

编译方式说明:

1. 静态编译:在编译时确定类型 & 绑定对象。如常见的使用new关键字创建对象

2. 动态编译:运行时确定类型 & 绑定对象。动态编译体现了Java的灵活性、多态特性 & 降低类之间的藕合性

2.2 缺点

  • 执行效率低
  • 因为反射的操作 主要通过JVM执行,所以时间成本会 高于 直接执行相同操作
  • 因为接口的通用性,Java的invoke方法是传object和object[]数组的。基本类型参数需要装箱和拆箱,产生大量额外的对象和内存开销,频繁促发GC。
  • 编译器难以对动态调用的代码提前做优化,比如方法内联。
  • 反射需要按名检索类和方法,有一定的时间开销。
  • 容易破坏类结构
  • 因为反射操作饶过了源码,容易干扰类原有的内部逻辑

3. 应用场景

  • 动态获取 类文件结构信息(如变量、方法等) & 调用对象的方法
  • 常用的需求场景有:动态代理、工厂模式优化、Java JDBC数据库操作等

下文会用实际例子详细讲解


4. 具体使用

4.1 Java反射机制提供的功能

Java编程:一步步带你如何深入了解神秘的Java反射机制

4.2 实现手段

  • 反射机制的实现 主要通过 操作java.lang.Class类
  • 下面将主要讲解 java.lang.Class 类

4.2.1 java.lang.Class 类

定义:java.lang.Class类是反射机制的基础

作用:存放着对应类型对象的 运行时信息

Java编程:一步步带你如何深入了解神秘的Java反射机制

每种类型的Class对象只有1个 = 地址只有1个

Java编程:一步步带你如何深入了解神秘的Java反射机制

Java反射机制的实现除了依靠Java.lang.Class类,还需要依靠:Constructor类、Field类、Method类,分别作用于类的各个组成部分:

Java编程:一步步带你如何深入了解神秘的Java反射机制

4.3 使用步骤

在使用Java反射机制时,主要步骤包括:

1. 获取 目标类型的Class对象

2. 通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象

3. 通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作

下面,我将详细讲解每个步骤中的使用方法。

步骤1:获取 目标类型的Class对象

Java编程:一步步带你如何深入了解神秘的Java反射机制

此处额外讲一下java.lang.reflect.Type类

  • java.lang.reflect.Type是 Java中所有类型的父接口
  • 这些类型包括:

Java编程:一步步带你如何深入了解神秘的Java反射机制

  • 之间的关系如下

Java编程:一步步带你如何深入了解神秘的Java反射机制

步骤2:通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象

Java编程:一步步带你如何深入了解神秘的Java反射机制

Java编程:一步步带你如何深入了解神秘的Java反射机制

步骤3:通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法 & 属性的具体信息 & 进行操作

Java编程:一步步带你如何深入了解神秘的Java反射机制

至此,关于Java反射机制的步骤说明已经讲解完毕。


4.4 特别注意:访问权限问题

  • 背景

反射机制的默认行为受限于Java的访问控制

如,无法访问( private )私有的方法、字段

  • 冲突

Java安全机制只允许查看任意对象有哪些域,而不允许读它们的值

若强制读取,将抛出异常

  • 解决方案

脱离Java程序中安全管理器的控制、屏蔽Java语言的访问检查,从而脱离访问控制

  • 具体实现手段:使用Field类、Method类 & Constructor类对象的setAccessible()

Java编程:一步步带你如何深入了解神秘的Java反射机制

猜你喜欢

转载自blog.csdn.net/gupao123456/article/details/81543892