Java 反射 (快速了解反射)
反射的概念
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
Java反射有三个动态性质:
1、运行时生成对象实例
2、运行期间调用方法
3、运行时更改属性
通过这些动态性质,JAVA反射可以在程序运行时获取对象和类的真实信息。
Java反射可以实现的功能:
1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象
3、在运行时判断任意一个类所具有的方法和属性
4、在运行时调用任意一个对象的方法
5、生成动态代理
与Java反射相关的类如下:
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
Class类
假如现在有一个私有的student 方法 想调用这个方法就可以使用反射
一个student 类如下
public class Student {private String name;private int age;private Student(String name, int age) {this.name = name;this.age = age;}public Student(){throw new IllegalAccessError("就不给你创建");}private String getName() {return name == null ? "" : name;}private void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
实现如下
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Fine{public static void main(String[] args){Class<?> clz = null;try {clz = Class.forName("Student");} catch (ClassNotFoundException e) {e.printStackTrace();}// 找到带有这个参数的构造方法Constructor constructor = null;try {constructor = clz.getDeclaredConstructor(String.class, int.class);} catch (NoSuchMethodException e) {e.printStackTrace();}constructor.setAccessible(true);// 初始化对象Object student = null;try {student = constructor.newInstance("张三", 18);} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}System.out.println("--------------"+constructor.toString());// 找到该私有方法Method getName = null;try {getName = clz.getDeclaredMethod("getName");} catch (NoSuchMethodException e) {e.printStackTrace();}getName.setAccessible(true);String name = null;try {name = (String) getName.invoke(student);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}System.out.println("--------------"+name);// 找到私有属性Field age = null;try {age = clz.getDeclaredField("age");} catch (NoSuchFieldException e) {e.printStackTrace();}age.setAccessible(true);try {age.setInt(student, 20); // 修改属性} catch (IllegalAccessException e) {e.printStackTrace();}try {System.out.println("--------------"+age.get(student));} catch (IllegalAccessException e) {e.printStackTrace();}}
}
输出结果:
Java 反射 (快速了解反射)相关推荐
- Java基于注解和反射导入导出Excel
代码地址如下: http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包 ...
- android反射替换字体,快速使用反射更换Android全局字体
问题背景 之前在编写鲤鱼日语时,因为使用了外部的字体,这导致了一个问题就是我的ListView显示的是圆滑的字体,但是其他dialog.Spinner就全都是Android默认字体,这样不统一就会很难 ...
- Java中的灵魂-反射机制
全文都是转载的嗑嗑磕嗑瓜子的猫这位大神的文章,写的非常好,转载过来主要是想将好的知识保存下来方便以后再查阅.原文请点这 思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? ...
- java 反射代价_Java反射机制
# 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- Java中为什么需要反射?反射要解决什么问题?
Java中为什么需要反射?反射要解决什么问题? 参考文章: (1)Java中为什么需要反射?反射要解决什么问题? (2)https://www.cnblogs.com/buoge/p/9285142. ...
- Java基础-注解和反射
Java基础-注解和反射 前言 对于注解,我主要还是在自定义APT还有运行时反射获取类来让自己能够构建出复用性更高的代码逻辑. 知识点1-注解: 注解的应用场景由元注解@Retention来进行指定, ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
- java泛型怎么用反射生成_Java 之 使用反射生成并操作对象
一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...
最新文章
- 支付宝支付 第十二集:狂神、飞哥支付宝支付配置代码(免费资源,拿走不谢)
- ScrollView和ListView冲突解决
- lua自动化脚本关于文本读写和特殊不可见字符转换的处理
- 【IM】关于半监督学习的理解
- 我的一个学生在运维工作中写的自动日志清理脚本程序
- 移动端网站,键盘弹出对页面的影响
- 关于EMF模型的操作,赶紧记下来
- redis -- 学习
- Serverless 实战 —— 从 DevOps 到 Serverless
- Dubbo -- 系统学习 笔记 -- 目录
- 2018/06/30这段时间的随笔记忆:遇到概念模糊的js问题
- 2020-07-17
- c语言工程师专业分析,一个资深c语言工程师说如何学习c语言.pdf
- swift 下标 subscript
- ERP系统-库存子系统-申购单
- 操作系统 考研习题 详细解析(1)
- C++小数该用什么数据类型
- AtCoder Grand Contest 021完整题解
- STM32实现低功耗待机总结(电流低至5.7uA)
- 图的基本概念、握手定理、Havel定理