当前位置: 首页 > news >正文

反射--通俗易懂

一、反射(Reflection)

  • 反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)

  • 动态语言,是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。

  • 通俗点说就是在运行时代码可以根据某些条件改变自身结构。

二、反射学什么

  • 学习获取类的信息,进行操作

    • 反射第一步:加载类(字节码文件到内存中),获取类的字节码---Class对象

    • 获取类的构造器:Constructor 对象

    • 获取类的成员变量:Field对象

    • 获取类的成员方法:Method对象

三、获取Class对象的三种方式

  • Class c1 = 类名.class

  • 调用提供的方法:public static forName(String package)

  • Object提供的方法:public Class getClass();

    • Class c3 = 对象.getClass();

四、获取类的构造器

4.1获取类的和构造器的作用:初始化对象然后返回

五、获取类的成员变量

5.1获取到成员变量的作用:赋值、取值

六、获取类的成员方法

6.1获取成员方法的作用:执行

七、反射作用,应用场景

八、案例

package com.itheima.myreflect7;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;/*** @author zhumq* @date 2024/7/1 23:43*/
public class ObjectFrame {// 目标:能够保存任意对象的字段和字段数据到文件中public static void saveObject(Object obj) throws Exception {PrintStream ps = new PrintStream(new FileOutputStream("myreflec\\src\\data.txt", true));// obj 任意对象,到底有多少字段要保存Class c = obj.getClass();String cName = c.getSimpleName();ps.println("-------------------"+cName+"-------------------");// 从class对象中获取所有的字段Field[] fields = c.getDeclaredFields();// 便利每个字段for (Field field : fields) {// 获取字段名称String name = field.getName();// 禁止检查访问权限field.setAccessible(true);// 获取字段值Object value = field.get(obj);// 保存到文件中ps.println(name + "=" + value);}ps.close();}
}

相关文章:

  • ModuleNotFoundError: No module named ‘_sysconfigdata_x86_64_conda_linux_gnu‘
  • YOLO在目标检测与视频轨迹追踪中的应用
  • 使用hadoop进行数据分析
  • library source does not match the bytecode for class SpringApplication
  • Ajax异步请求 axios
  • 深⼊理解 JVM 底层原理、垃圾回收机制,能通过mat、jstat进行JVM参数调优
  • 关于5G和卫星
  • 昇思第7天
  • 递归算法练习
  • Qt的信号与槽机制底层原理
  • 核方法总结(三)———核主成分(kernel PCA)学习笔记
  • 【Python】字典练习
  • 深入了解 Redis 五种类型命令与如何在 Java 中操作 Redis
  • 冒泡排序写法
  • javaEE——Servlet
  • 230. Kth Smallest Element in a BST
  • CSS实用技巧
  • httpie使用详解
  • JAVA SE 6 GC调优笔记
  • Netty 4.1 源代码学习:线程模型
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Promise面试题,控制异步流程
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpriteKit 技巧之添加背景图片
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 时间复杂度与空间复杂度分析
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • #pragma multi_compile #pragma shader_feature
  • #宝哥教你#查看jquery绑定的事件函数
  • (1) caustics\
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (利用IDEA+Maven)定制属于自己的jar包
  • (四)React组件、useState、组件样式
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)C#调用WebService 基础
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net 程序发生了一个不可捕获的异常
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 托管代码与非托管代码
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • @PreAuthorize注解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ JavaScript ] JSON方法
  • [ Linux ] Linux信号概述 信号的产生
  • [ NOI 2001 ] 食物链