反射的概念

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 反射 (快速了解反射)相关推荐

  1. Java基于注解和反射导入导出Excel

    代码地址如下: http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包 ...

  2. android反射替换字体,快速使用反射更换Android全局字体

    问题背景 之前在编写鲤鱼日语时,因为使用了外部的字体,这导致了一个问题就是我的ListView显示的是圆滑的字体,但是其他dialog.Spinner就全都是Android默认字体,这样不统一就会很难 ...

  3. Java中的灵魂-反射机制

    全文都是转载的嗑嗑磕嗑瓜子的猫这位大神的文章,写的非常好,转载过来主要是想将好的知识保存下来方便以后再查阅.原文请点这 思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? ...

  4. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  5. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  6. Java中为什么需要反射?反射要解决什么问题?

    Java中为什么需要反射?反射要解决什么问题? 参考文章: (1)Java中为什么需要反射?反射要解决什么问题? (2)https://www.cnblogs.com/buoge/p/9285142. ...

  7. Java基础-注解和反射

    Java基础-注解和反射 前言 对于注解,我主要还是在自定义APT还有运行时反射获取类来让自己能够构建出复用性更高的代码逻辑. 知识点1-注解: 注解的应用场景由元注解@Retention来进行指定, ...

  8. Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...

  9. java泛型怎么用反射生成_Java 之 使用反射生成并操作对象

    一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...

最新文章

  1. 支付宝支付 第十二集:狂神、飞哥支付宝支付配置代码(免费资源,拿走不谢)
  2. ScrollView和ListView冲突解决
  3. lua自动化脚本关于文本读写和特殊不可见字符转换的处理
  4. 【IM】关于半监督学习的理解
  5. 我的一个学生在运维工作中写的自动日志清理脚本程序
  6. 移动端网站,键盘弹出对页面的影响
  7. 关于EMF模型的操作,赶紧记下来
  8. redis -- 学习
  9. Serverless 实战 —— 从 DevOps 到 Serverless
  10. Dubbo -- 系统学习 笔记 -- 目录
  11. 2018/06/30这段时间的随笔记忆:遇到概念模糊的js问题
  12. 2020-07-17
  13. c语言工程师专业分析,一个资深c语言工程师说如何学习c语言.pdf
  14. swift 下标 subscript
  15. ERP系统-库存子系统-申购单
  16. 操作系统 考研习题 详细解析(1)
  17. C++小数该用什么数据类型
  18. AtCoder Grand Contest 021完整题解
  19. STM32实现低功耗待机总结(电流低至5.7uA)
  20. 图的基本概念、握手定理、Havel定理

热门文章

  1. zip压缩多个文件,解压时不包含目录层级
  2. 简单解决用VS编写hello world时命令行一闪而过
  3. 2022-2028年中国乙烷行业投资分析及前景预测报告
  4. shell 批量转换文件编码
  5. intellij idea 常见遇到的问题整理
  6. JIT Code Generation代码生成
  7. Lambda 表达式基础理论与示例
  8. 2021年大数据ELK(八):Elasticsearch安装IK分词器插件
  9. 2021年大数据Hadoop(七):HDFS分布式文件系统简介
  10. BigDecimal 转换为int 或者其他类型