网站首页 > java教程 正文
前言
- 在 Java中,反射机制(Reflection)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘
目录
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反射机制提供的功能
4.2 实现手段
- 反射机制的实现 主要通过 操作java.lang.Class类
- 下面将主要讲解 java.lang.Class 类
4.2.1 java.lang.Class 类
定义:java.lang.Class类是反射机制的基础
作用:存放着对应类型对象的 运行时信息
每种类型的Class对象只有1个 = 地址只有1个
Java反射机制的实现除了依靠Java.lang.Class类,还需要依靠:Constructor类、Field类、Method类,分别作用于类的各个组成部分:
4.3 使用步骤
在使用Java反射机制时,主要步骤包括:
1. 获取 目标类型的Class对象
2. 通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象
3. 通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作
下面,我将详细讲解每个步骤中的使用方法。
步骤1:获取 目标类型的Class对象
此处额外讲一下java.lang.reflect.Type类
- java.lang.reflect.Type是 Java中所有类型的父接口
- 这些类型包括:
- 之间的关系如下
步骤2:通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象
步骤3:通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法 & 属性的具体信息 & 进行操作
至此,关于Java反射机制的步骤说明已经讲解完毕。
4.4 特别注意:访问权限问题
- 背景
反射机制的默认行为受限于Java的访问控制
如,无法访问( private )私有的方法、字段
- 冲突
Java安全机制只允许查看任意对象有哪些域,而不允许读它们的值
若强制读取,将抛出异常
- 解决方案
脱离Java程序中安全管理器的控制、屏蔽Java语言的访问检查,从而脱离访问控制
- 具体实现手段:使用Field类、Method类 & Constructor类对象的setAccessible()
猜你喜欢
- 2024-09-30 java反射机制深度探讨(java反射机制的原理和用途)
- 2024-09-30 Java中的反射到底有什么用?(java反射的用途及实现)
- 2024-09-30 JAVA 反射机制(Java反射机制的作用包括)
- 2024-09-30 Java的反射机制是什么?#干货分享(java反射机制实现原理)
- 2024-09-30 Java基础:反射机制(java反射机制实例)
- 2024-09-30 想成为java架构师,你首先得掌握的Java反射机制,安排
- 2024-09-30 Java面试篇基础部分-Java反射机制是什么
- 2024-09-30 谈谈Java反射机制(java的反射机制)
- 2024-09-30 Java后端精选技术:Java的反射机制
- 2024-09-30 Java的反射机制大家都会了,你还不会吗?
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)