7.javaSE基础_进阶:反射机制(Method,Filed,Constructor,Properties)

文章目录

    • 一.反射
      • 1.定义
      • 2.功能
      • 3.应用
      • 4.常用类和API
      • 5.Class类
      • 5.Class实例方式
    • 二.相关类及API
      • 1.Method类
        • 1)invoke方法
      • 2.Field类
        • 1)给属性赋值
      • 3.Constructor类
    • 三.Proterties
      • 1.定义
      • **2.Properties特点:**
      • 3.properties配置文件作用
      • 4.常用方法
      • 5.Java读取Properties文件

一.反射

1.定义

程序可以访问、检测和修改它本身状态或行为的一种能力。

Java的反射机制是在编译时,并不确定哪个类被加载,而是在运行时才加载,这样的特点就是反射

2.功能

在运行时获取一个对象的类信息:访问修饰符、成员、方法、构造及超类的信息。

  • 动态生成对象:反射机制可以在运行时生成对象,这样就可以根据参数的不同,动态的创建不同的类的实例对象。
  • 动态调用方法:通过反射机制可以调用类中的方法,不论这些方法是否是公共的,也不论这些方法的参数个数和类型是什么,反射机制都具有这样的能力。
  • 动态修改属性:利用反射机制可以获取到类中的所有成员变量,并可以对其进行修改

3.应用

  • 开发框架

    IDEA编译时,我们输入一个对象等元素时按.会自动罗列它的属性和方法

  • 框架(Spring,Mybatis,Hibernate)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象

4.常用类和API

使用java.lang.Class类,反设制的起源;

当一个类被加载后,Java虚拟机就会自动产生一个Class对象,通过该对象就能获得该对象的方法、成员及构造等信息;

生成java文件会自动生成相应的class文件

实现反射的类,于java.lang.reflect包中:

含义
Method代表类的方法
Constructor代表类的构造方法
Field代表类的成员变量

5.Class类

  • 方法:

    方法名备注
    public String getName()返回完整类名带包名
    public String getSimpleName()返回类名
    public Field[] getFields()返回类中public修饰的属性
    public Field[] getDeclaredFields()返回类中所有的属性
    public Field getDeclaredField(String name)根据属性名name获取指定的属性
    public native int getModifiers()获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Method[] getDeclaredMethods()返回类中所有的实例方法
    public Method getDeclaredMethod(String name, Class<?>… parameterTypes)根据方法名name和方法形参获取指定方法
    public Constructor<?>[] getDeclaredConstructors()返回类中所有的构造方法
    public Constructor getDeclaredConstructor(Class<?>… parameterTypes)根据方法形参获取指定的构造方法
    public native Class<? super T> getSuperclass()返回调用类的父类
    public Class<?>[] getInterfaces()返回调用类实现的接口集合
    public T newInstance()创建对象
  • newInstance()

    通过反射实例化对象

       Class<Opertor> aClass = Opertor.class;Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法System.out.println(invoke);

5.Class实例方式

  1. 方式1
Class<?> aClass = Class.forName("java.util.ArrayList");
Method[] methods = aClass.getMethods();
for (Method method : methods) {System.out.println(method);
}
Class<?>[] interfaces = aClass.getInterfaces();
for (Class<?> anInterface : interfaces) {System.out.println(anInterface);
}
  1. 方式2:

     Class<Opertor> aClass = Opertor.class;//Optertor类名Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法System.out.println(invoke);
    
  2. 方式3:

    //getClass()方法
    Class<? extends Student> aClass = student.getClass();
    

二.相关类及API

1.Method类

  • 方法:

    方法名备注
    public String getName()返回方法名
    public int getModifiers()获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Class<?> getReturnType()以Class类型,返回方法类型【一般配合Class类的getSimpleName()方法使用】
    public Class<?>[] getParameterTypes()返回方法的修饰符列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】
    public Object invoke(Object obj, Object… args)调用方法
//获取类中所有自定义方法Class<Opertor> aClass = Opertor.class;Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法System.out.println(invoke);
1)invoke方法

invoke方法:对带有指定参数的指定对象调用由此 Method 对象表示的基础方法方法.invoke(对象, 实参);

2.Field类

  • 常用方法

    方法名备注
    public String getName()返回属性名
    public int getModifiers()获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Class<?> getType()以Class类型,返回属性类型【一般配合Class类的getSimpleName()方法使用】
    public void set(Object obj, Object value)设置属性值
    public Object get(Object obj)读取属性值
    public void setAccessible(true)允许访问私有属性
    getDeclaredFields()迭代所有属性
1)给属性赋值

属性.set(对象, 值);

属性.get(对象);

注意这里使用的是getDeclaredFields

3.Constructor类

  • 常用方法:

    方法名备注
    public String getName()返回构造方法名
    public int getModifiers()获取构造方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Class<?>[] getParameterTypes()返回构造方法的修饰符列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】
    public T newInstance(Object … initargs)创建对象【参数为创建对象的数据】

三.Proterties

1.定义

Properties 类表示了一个持久的属性集,是一个Map体系集合类,因为其继承于Hashtable,而Hashtable继承于Dictionary类,实现了Map接口,所以Properties也保留了其相关特性。

2.Properties特点:

  • Properties是Hashtable<Object,Object>的子类;
  • Properties类表示了一个可持久的属性集;
  • Properties可以保存在流中或从流中加载;
  • Properties中每个键和对应的值都是一个字符串(String类型);
  • Properties有一个特殊的作用:专门用来加载xxx.properties配置文件。

3.properties配置文件作用

properties配置主要的作用是通过修改配置文件可以方便地修改代码中的参数,实现不用改class文件即可灵活变更参数。

在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用"#"来注释

java运行中java文件会变成class文件,之后无法通过反编译找到原样的代码,这样的话,如果java类中某个参数变更,就很难灵活的实现参数修改,这个时候properties 文件就能很灵活的实现配置,减少代码的维护成本和提高开发效率

4.常用方法

方法说明
getProperty ( String key)用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value
load ( InputStream is)从输入流中读取属性列表(键和元素对)。通过对指定的文件进行装载来获取该文件中的所有键 - 值对。以供 getProperty ( String key) 来搜索
setProperty ( String key, String value)调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对
store ( OutputStream out, String comments)以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去
clear ()清除所有装载的 键 - 值对。该方法在基类中提供

5.Java读取Properties文件

Java读取Properties文件的方法有很多,常见有以下几种方式:

使用方式文件位置
new BufferedInputStream(new FileInputStream("source.properties"))项目根目录
Class.getClassLoader().getResourceAsStream("source.properties")src下(ClassPath根)
Class.getResourceAsStream(String path)
 Properties properties = new Properties();InputStream inputStream = Demo08.class.getClassLoader().getResourceAsStream("config.properties");properties.load(inputStream);String property = properties.getProperty("name");String property1 = properties.getProperty("age");System.out.println("name="+property+"\n"+"age="+property1);

ties.load(inputStream);
String property = properties.getProperty(“name”);
String property1 = properties.getProperty(“age”);
System.out.println(“name=”+property+“\n”+“age=”+property1);


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前置章节-熟悉Python、Numpy、SciPy和matplotlib

目录 一、编程环境-使用jupyter notebook 1.下载homebrew包管理工具 2.安装Python环境 3.安装jupyter 4.下载Anaconda使用conda 5.使用conda设置虚拟环境 二、学习Python基础 1.快排的Python实现 (1)列表推导-一种创建列表的简洁方式 (2)列表相加 2.基本数据类型及运…

FastGPT 调用Qwen 测试Hello world

Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录&#xff0c; 点击右上角的 新建 点击 这里&#xff0c;配置AI使用本地 ollama跑的qwen模型 问题&#xff1a;树上有3只鸟&#xff0c;开了一枪&#…

实战STM32:硬件SPI与模拟SPI读写W25Q64存储芯片

摘要 本文是一篇实战教程&#xff0c;指导读者如何在STM32微控制器上通过硬件SPI和模拟SPI实现对W25Q64存储芯片的读写操作。W25Q64是一款8Mbit的SPI Flash存储器&#xff0c;适用于需要非易失性存储的嵌入式系统。本文将深入讲解硬件连接、SPI配置、读写流程&#xff0c;并提…

使用CDN方式创建Vue3.0应用程序

CDN 的全称是 content delivery network&#xff0c;即内容分发网络。它是构建在现在的互联网基础之上的一层智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发和调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c…

matlab量子纠缠态以及量子门操作下的量子态

前言 今天我们来聊聊题外话&#xff0c;量子纠缠&#xff0c;在目前物理分支中&#xff0c;要说最深&#xff0c;最能改变人类对宇宙影响的莫过于量子力学了&#xff0c;假如我们可以人为的对两个粒子施加纠缠态&#xff0c;那么我们将可以足不出户的完成对外界的操控 简介 …

《TopFormer: Token Pyramid Transformer for Mobile Semantic Segmentation》

期刊&#xff1a;CVPR 年份&#xff1a;2022 代码&#xff1a;https://github.com/hustvl/TopFormer 摘要 尽管视觉Transformer(ViTs)在计算机视觉领域取得了巨大的成功&#xff0c;但沉重的计算成本阻碍了它们在密集预测任务中的应用&#xff0c;如移动设备上的语义分割。…

Superagent:一个开源的AI助手框架与API

在人工智能日益普及的今天,如何将AI助手无缝集成到应用中成为了开发者们关注的焦点。今天,我们要介绍的Superagent正是一个为这一需求量身打造的开源框架与API。它结合了LLM、检索增强生成(RAG)和生成式AI技术,为开发者们提供了一个强大而灵活的解决方案。 一、Superagen…

电阻屏和电容屏

目录 一、电阻屏 1.欧姆定律 2.电阻屏原理 &#xff08;1&#xff09;测量 X 坐标 &#xff08;2&#xff09;测量 Y 坐标 3.电阻屏数据 二、电阻屏 1.原理 2.电容屏数据 &#xff08;1&#xff09;Type A &#xff08;2&#xff09;Type B 3.电容屏的实验数据 一、…

C# Socket

Socket命名空间&#xff1a;创建 Socket&#xff1a;连接到服务器&#xff08;客户端&#xff09;&#xff1a;绑定和监听&#xff08;服务器端&#xff09;&#xff1a;接受连接&#xff08;服务器端&#xff09;&#xff1a;发送和接收数据&#xff1a;关闭 Socket&#xff1…

实战案例:如何用ChatGPT生成适合不同领域的高质量文章

随着人工智能技术的飞速发展&#xff0c;生成高质量文章已经不再是难题。特别是OpenAI开发的ChatGPT&#xff0c;更是为写作工作带来了极大的便利。那么&#xff0c;如何用ChatGPT生成适合不同领域的高质量文章呢&#xff1f;本文将通过实战案例&#xff0c;为大家详细讲解这一…

「实验笔记」华为HCIE(云服务)2.0-迁移实验-传统应用架构迁移

实验介绍 本实验先是在华为云上搭建了WordPress、自建mysql以及配置OBS存储&#xff0c;来模拟待迁移的环境。 随后通过华为云的迁移工具&#xff0c;将源环境迁移至华为云的目标环境&#xff08;另一个区域&#xff09;1、使用SMS&#xff08;主机迁移服务&#xff09;迁移应…

ARM 240625

练习&#xff1a; 汇编实现1-100累加&#xff0c;结果保存在r0 .text 声明下面内容都属于文本段内容 .globl _start 声明 _start 是一个全局启用的标签_start: 封装 _start 标签&#xff0c;汇编的标签和C中函数类似mov r0,#0 mov 把0 搬运到 r0 寄存器mov r1,#1 mov 把1 …

DWC USB2.0协议学习2--架构介绍

目录 1 系统级架构 1.1 DWC_otg PMU模块 1.2 DWC_otg层次结构框图 1.3 DWC_otg功能模块框图 1.4 USB Host体系结构 1.4.1 发送FIFO 1.4.2 接收FIFO 1.5 USB Device体系结构 1.5.1专用发送FIFO 1.5.2 单个接收FIFO 2 DWC_otg_core架构 2.1 AHB总线接口单元(BIU) 2.2…

SAP揭秘者-在QM标准功能增加取消UD的功能第二季

文章摘要&#xff1a; 上篇文章我已经给大家介绍怎么开发两个程序来取消UD&#xff0c;但是上篇文章中有提到这个时候去直接执行ZQEVAC40程序去取消物料凭证 则会报错&#xff0c;那么为了解决这个报错&#xff0c;我们需要更改后台配置。 接下来我给大家讲后台配置该怎么配置&…

软考初级网络管理员__其他单选题

1.某企业资料窒员工张敏和王莉负责向系统中录入一批图书信息(如:图书编号、书名、作者、出版社、联系方式等信息)。要求在保证质量的前提下&#xff0c;尽可能高效率地完成任务。对于如下4种工作方式&#xff0c;()比较恰当。 张敏独立完成图书信息的录入&#xff0c;王莉抽查…

浅谈Tomcat

文章目录 一、什么是Tomcat&#xff1f;二、Tomcat的下载安装三、使用tomcat访问资源 一、什么是Tomcat&#xff1f; Tomcat 就是一个 HTTP 服务器。 前面我们聊了HTTP服务器&#xff0c;像我们在网页输入URL&#xff0c;其实就是在给人家的HTTP服务器发送请求&#xff0c;既…

qt 读写json格式的文件应用举例 工具函数

1.概要 要做一个json的读取功能&#xff0c;先做一个原型&#xff0c;然后在实际的工程中套用 2.代码 2.1 main.cpp #include "widget.h" #include "inijsonparams.h"#include <QApplication>int main(int argc, char *argv[]) {IniJsonParams i…

华为MDC开发者调试工具以及配置使用介绍

MDC的开发过程的三大工具&#xff1a;MMC、MDS、Mind Studio&#xff0c;这三个工具完成了开发过程中的配置文件编写、代码编写以及AI模型的开发三个任务。除了开发&#xff0c;MDC还准备了两个调试工具&#xff0c;用于使用过程中数据的查看等。这一些调试工具分别对映射MDC中…

3.sping掌握Bean生命周期

在Spring框架中&#xff0c;Bean的生命周期指的是从Bean被创建到销毁的整个过程。掌握Bean的生命周期对于开发者来说非常重要&#xff0c;因为它可以帮助开发者更好地理解Spring如何管理Bean&#xff0c;以及如何在Bean的不同阶段插入自定义逻辑。以下是Bean生命周期的主要阶段…

802.11漫游流程简单解析与笔记_Part2_02_wpa_supplicant、cfg80211、nl80211内核与驱动的关系

wpa、cfg80211、nl80211内核与驱动的关系示意图如下&#xff1a; nl80211和cfg80211都是内核定义的标准接口&#xff0c;目的是规范驱动和应用的统一调用&#xff0c;wpa中常出现nl80211就是通过内核的nl80211接口调用对应cfg80211的部分&#xff0c;进而控制驱动收发数据或切换…