17.反射与动态代理

  • 目录

    1.反射的概述

    2.学习反射到底学什么?

    3.字节码文件和字节码文件对象

    4.获取字节码文件对象的三种方式

    5.Class类中用于获取构造方法的方法

    6.Class类中用于获取成员变量的方法

    7.Class类中用于获取成员方法的方法

    8.反射和配置文件结合动态获取的练习与利用反射保存对象中的信息练习(重点)

    9.动态代理


  • 1.反射的概述

    • 1.1专业解释
      • 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
      • 对于任意一个对象,都能够调用它的任意属性和方法;
      • 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
    • 1.2通俗的理解
      • 利用反射创建的对象可以无视修饰符调用类里面的内容
      • 可以跟配置文件结合起来使用,把要创建的对象信息和方法写在配置文件中。
      • 读取到什么类,就创建什么类的对象
      • 读取到什么方法,就调用什么方法
      • 此时当需求变更的时候不需要修改代码,只要修改配置文件即可。
  • 2.学习反射到底学什么?

    • 反射允许对成员变量,成员方法和构造方法的信息进行编程访问

    • 反射都是从class字节码文件中获取的内容。
      • 如何获取class字节码文件的对象
      • 利用反射如何获取构造方法(创建对象)
      • 利用反射如何获取成员变量(赋值,获取值)
      • 利用反射如何获取成员方法(运行)
    • 反射应用的两个方向
      • 第一个方向:无视修饰符访问类中的内容。但是这种操作在开发中一般不用,都是框架底层来用的。
      • 第二个方向:反射可以跟配置文件结合起来使用,动态的创建对象,动态的调用方法。
  • 3.字节码文件和字节码文件对象

    • java文件:就是我们自己编写的java代码。
    • 字节码文件:就是通过java文件编译之后的class文件(是在硬盘上真实存在的,用眼睛能看到的)
    • 字节码文件对象:当class文件加载到内存之后,虚拟机自动创建出来的对象。
    • 这个对象里面至少包含了:构造方法,成员变量,成员方法。
    • 而我们的反射获取的是什么?字节码文件对象,这个对象在内存中是唯一的。
  • 4.获取字节码文件对象的三种方式

    • 3.1Class这个类里面的静态方法forName(“全类名”)(最常用)
      • Class clazz1 = Class.forName("com.itheima.reflectdemo.Student");
        全类名 = 包名 + 类名
      • 注解:
        • 源代码阶段获取 --- 先把Student加载到内存中,再获取字节码文件的对象
        • clazz 就表示Student这个类的字节码文件对象。
        • 就是当Student.class这个文件加载到内存之后,产生的字节码文件对象
    • 3.2通过class属性获取
      • Class clazz2 = Student.class;
    • 3.3通过对象获取字节码文件对象
      • Student s = new Student();
      • Class clazz3 = s.getClass();
    • 3.4注意:
      • 因为class文件在硬盘中是唯一的,所以,当这个文件加载到内存之后产生的对象也是唯一的
      • System.out.println(clazz1 == clazz2);//true
      • System.out.println(clazz2 == clazz3);//true
  • 5.Class类中用于获取构造方法的方法

    • 5.1方法名
      • Constructor<?>[] getConstructors()
        获得所有的构造(只能public修饰)
      • Constructor<?>[] getDeclaredConstructors()
        获得所有的构造(包含private修饰)
      • Constructor<T> getConstructor(Class<?>... parameterTypes)
        获取指定构造(只能public修饰)
      • Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
        获取指定构造(包含private修饰)
        Constructor con4 = clazz.getDeclaredConstructor(String.class);​
    • 5.2获取构造方法并创建对象
      • 涉及到的方法:newInstance(创建对象)与setAccessible(临时修改构造方法的访问权限)
      • 代码示例:JavaBean类

      • 代码示例:测试类

  • 6.Class类中用于获取成员变量的方法

    • 6.1方法名
      • Field[] getFields()
        返回所有成员变量对象的数组(只能拿public的)
      • Field[] getDeclaredFields()
        返回所有成员变量对象的数组,存在就能拿到
      • Field getField(String name)
        返回单个成员变量对象(只能拿public的)
      • Field getDeclaredField(String name)
        返回单个成员变量对象,存在就能拿到
    • 6.2获取成员变量并获取值和修改值
      • void set(Object obj, Object value)
        赋值 :参数一:表示要修改哪个对象的name? 参数二:表示要修改为多少?
      • Object get(Object obj)
        获取值
      • 代码示例:

  • 7.Class类中用于获取成员方法的方法

    • 7.1方法名
      • Method[] getMethods()
        返回所有成员方法对象的数组(只能拿public的)
        getMethods可以获取父类中public修饰的方法
      • Method[] getDeclaredMethods()
        返回所有成员方法对象的数组,存在就能拿到
      • Method getMethod(String name, Class<?>... parameterTypes)
        返回单个成员方法对象(只能拿public的)
      • Method getDeclaredMethod(String name, Class<?>... parameterTypes)
        返回单个成员方法对象,存在就能拿到
    • 7.2获取成员方法并运行
      • Object invoke(Object obj, Object... args) :运行方法
      • 参数一:用obj对象调用该方法
      • 参数二:调用方法的传递的参数(如果没有就不写)
      • 返回值:方法的返回值(如果没有就不写)
      • 代码示例:JavaBean类

      • 代码示例:测试类

  • 8.反射和配置文件结合动态获取的练习与利用反射保存对象中的信息练习(重点)

    • 8.1配置文件
      • 好处:1. 可以把软件的设置永久化存储 2. 如果我们要修改参数,不需要改动代码,直接修改配置文件就可以了
      • properties配置文件

      • 重点:1. properties是一个双列集合,拥有Map集合所有的特点 2. 有一些特有的方法,可以把集合中的数据,按照键值对的形式写到配置文件当中。也可以把配置文件中的数据,读取到集合中来。
    • 8.2需求:利用反射根据文件中的不同类名和方法名,创建不同的对象并调用方法。
    • 8.3分析:
      • ①通过Properties加载配置文件
      • ②得到类名和方法名
      • ③通过类名反射得到Class对象
      • ④通过Class对象创建一个对象
      • ⑤通过Class对象得到方法
      • ⑥调用方法
    • 8.4示例代码

    • 8.5利用反射保存对象中的信息练习
  • 9.动态代理

    • 9.1动态代理的功能
      • 可以无侵入式的给对象增强其他的功能(调用者 --> 代理 --> 对象)
    • 9.2Java通过什么来保证代理的样子
      • 通过接口保证,后面的对象和代理需要实现同一个接口,接口中就是被代理的所有方法
    • 9.3动态代理三要素:
      • 1,真正干活的对象
      • 2,代理对象
      • 3,利用代理调用方法
    • 9.4如何创建一个代理对象?
      • java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法
      • public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)


        参数一:用于指定用哪个类加载器,去加载生成的代理类
        ​参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
        ​参数三:用来指定生成的代理对象要干什么事情
    • 9.5代码示例
      • 代码示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1553074.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java类和对象、自定义包、static、代码块、方法重写

目录 1.类和对象 2.this指针 3.对象的构造和初始化 3.1默认初始化 3.2就地初始化 3.3构造初始化 3.4IDEA快速填充 3.5使用this简化 3.6初始化的总结 4.包的引入 4.1包的概念 4.2导入包中的类 4.3自定义包 5.static修饰 6.代码块的划分 7.方法重写 1.类和对象 使…

C++系列-多态

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 多态 多态就是不同类型的对象&#xff0c;去做同一个行为&#xff0c;但是产生的结果是不同的。 比如说&#xff1a; 都是动物叫声&#xff0c;猫是喵喵&#xff0c;狗是汪汪&am…

rancher hello-world

创建一个Deployment, 只填名称和容器镜像rancher/hello-world 成功后: 查看日志 结果&#xff1a; 部署了工作负载。这个过程可能需要几分钟完成。 当您的工作负载部署完成后&#xff0c;它的状态将变为Active&#xff0c;您可以从项目的工作负载页面查看工作负载当前的状态…

ARM assembly: Lesson 10

今天&#xff0c;我们来看一下基于ARM汇编&#xff0c;如何实现函数的调用。 基础知识 在ARM汇编中&#xff0c;函数的前四个参数存放于 R0~R3寄存器中, 剩余的参数存放于栈中&#xff0c;返回值存放于r0。在栈中存放数值&#xff0c;可以避免在调用过程中&#xff0c;数据的…

串--KMP算法之手动计算next数组(详解)

目录 一、手动计算next数组 二、使用next数组进行模式匹配 三、练习 一、手动计算next数组 next[2] 表示模式串和主串对比&#xff0c;模式串里面第2个字符和主串不匹配&#xff0c;j应该指向几&#xff1f; 首先&#xff1a;字符串的下标和next数组下标保持一致 字符串是1~…

初识TCP/IP协议

回顾上文 来回顾一下TCP协议的特性&#xff0c;有一道比较经典的题&#xff1a;如何使用UDP实现可靠传输&#xff0c;通过应用程序的代码&#xff0c;完成可靠传输的过程&#xff1f; 原则&#xff0c;TCO有啥就吹啥&#xff0c;引入滑动窗口&#xff0c;引入流量控制&#x…

计算机毕业设计 农场投入品运营管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

ECP5701:PD协议芯片兼容PD 2.0和PD 3.0 (5V,9V,12V,15V,20V),支持 PD 输入多种类型无线充方案

TYPE-C接口&#xff0c;全称USB Type-C&#xff0c;是近年来在电子设备中广泛采用的一种新型接口。它以其小巧的尺寸、可逆的插拔方向以及高速的数据传输能力&#xff0c;迅速取代了传统的USB接口&#xff0c;成为现代设备的标准配置。不仅如此&#xff0c;TYPE-C接口还支持PD&…

2024年音频转文字:不可错过的四大工具!

在数字化办公和学习的背景下&#xff0c;音频转文字服务正变得越来越重要。本文将针对几款备受推崇的音频转文字工具进行深入解析&#xff01; 365在线转文字&#xff1a;云端处理&#xff0c;无需下载 直达链接&#xff1a;www.pdf365.cn/ 365在线转文字以其高效的转录速度…

Pikachu-Cross-Site Scripting-存储型xss

存储型xss &#xff0c;随便输入点内容&#xff0c;都能保存下来&#xff1b;刷新后也不会丢失&#xff1b;输入特殊字符&#xff0c;也能原样返回&#xff1b; 查看代码&#xff0c;也可以看到输出结果直接原路返回&#xff0c;不做处理 构造payload <script>alert(1)…

batch和momentum

&#x1f680; 机器学习系列前期回顾 1、初识机器学习 2、线性模型到神经网络 3、local minima的问题如何解决 &#x1f680;在初识机器学习中&#xff0c;了解了机器学习是如何工作的并引入了线性模型&#xff0c;在线性模型到神经网络这节&#xff0c;将线性模型进一步改进为…

【web安全】——XSS漏洞

1.XSS漏洞基础 1.1.漏洞成因 XSS(Cross-site scripting)被称为跨站脚本攻击&#xff0c;由于与层叠样式表的缩写一样&#xff0c;因此被缩写为XSS.XSS漏洞形成的原因是网站/程序对前端用户的输入过滤不严格&#xff0c;导致攻击者可以将恶意的is/html代码注入到网页中&#x…

基于Word2Vec和LSTM实现微博评论情感分析

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

【Python报错已解决】TypeError: unsupported operand type(s) for +: ‘str‘ and ‘int‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【C++前缀和】2845. 统计趣味子数组的数目|2073

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2845. 统计趣味子数组的数目 难度分&#xff1a;2073 给你一个下标从 0 开始的整数数组 nums &#xff0c;以及整数 modulo 和整数 k 。 请你找出并统计数组…

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第3关Git 基础知识

任务编号 任务名称 任务描述 1 破冰活动 提交一份自我介绍。 2 实践项目 创建并提交一个项目。 破冰活动 提交一份自我介绍。 每位参与者提交一份自我介绍。 提交地址&#xff1a;https://github.com/InternLM/Tutorial 的 camp3 分支&#xff5e; 安装并设置git 克隆仓库并…

分散加载文件 scatter files

目录 一、加载域和执行域二、Image entry points三、映射符号四、链接器预定义符号1、将符号引入到程序中1.1 引入到 C/C1.2 引入到汇编 2、域相关的符号2.1 执行域符号 Image$$2.2 执行域符号 Load$$2.3 加载域符号 Load$$LR$$2.4 节相关的符号2.5 镜像符号2.6 输入节符号 五、…

【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

文章目录 服务&#xff08;Service&#xff09;和服务实例&#xff08;Instance&#xff09;定义服务服务元数据定义实例实例元数据持久化属性 集群定义集群 生命周期服务的生命周期实例的生命周期集群的生命周期元数据的生命周期 服务&#xff08;Service&#xff09;和服务实…

收单外包机构备案分析及建议

2020年9月16日&#xff0c;中国支付清算协会&#xff08;下称“中支协”或“协会”&#xff09;公示了首批收单外包服务机构备案名单。历经5年&#xff0c;约进行50次公示后&#xff0c;截至9月21日共备案收单外包机构32457家&#xff0c;取消备案机构316家&#xff0c;拟取消机…

YOLO v11实时目标检测3:训练数据集格式说明

一、Yolov11简介 YOLOv11 是 YOLO 系列的最新版本&#xff0c;它不仅在目标检测方面表现出色&#xff0c;还引入了对象分割和多目标跟踪的功能。本文将介绍如何使用 YOLOv11 进行人流统计、车流统计以及跟踪的实际应用。 二、Yolo v11训练数据集格式说明 2.1 数据组织&#…