了解并学会使用反射

news2024/11/15 21:47:51

目录

一、反射的应用场景(简单了解)

二、反射的定义

三、关于反射的四个重要的类

四、反射的使用

1.Class获取一个class对象的方式

方式一:forName():

方式二:封装类.Class:

方式三:对象.getClass:

三种方式的使用场景

2.Constructor获取类的构造方法

3.Field获取类的字段(成员变量)

4.Method获取类的成员方法


一、反射的应用场景(简单了解)

在刚学习java时,或者还没有进行实际的项目开发时,反射运用的情况相对较少。

不过也是必须掌握的知识点,而且它也并不难。

学完之后,要运用时,回来复习复习,就差不多了。

反射的主要用途有:

1. 在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法 。

2. 反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无 论是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的 就是类的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。


二、反射的定义

Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法

他就相当于一个魔镜,在运行状态下,给他照一个类,就能在镜子中看到他所有的内容,包括private修饰的字段、方法等。

这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。

看定义有点复杂,但是说了这么多,反射实际上就是:

可以获取一个封装类中的任何字段、构造方法、成员方法的一个机制。

如图(*/ω\*):


三、关于反射的四个重要的类

要想使用反射需要铺垫很多东西,才能懂,要使用反射,掌握这些知识是必要的,先不急,慢慢来。

简单看看下面的这四个类,这类四中的有很多关于反射的成员方法,等一下会介绍的奥,留有印象就行。


四、反射的使用

,使用反射获取Student类的属性和方法为例

一下是Student类的定义:

package Test1;

/**
 * Created with IntelliJ IDEA
 * Description:
 * User:34398
 * Date:2024-05-04
 * Time:10:33
 */
public class Student {
    public String Happy;

    private String name;
    private int age;


    private Student(String happy) {//私有的有参数构造方法
        this.Happy = happy;
    }


    public Student() {
    }//无参构造方法


    public Student(String name, int age) {//有参构造方法
        this.name = name;
        this.age = age;
    }


    private String setHappys(String happy){//私有含参数,成员方法
        this.Happy=happy;
        System.out.println("爱好:"+this.Happy);
return happy;

    }

    private void printfName() {//私有成员方法
        System.out.println("名字:" + this.name);
    }

    public void printfAge() {//公有成员方法
        System.out.println("年龄:" + this.age);
    }
    
    
    
    //一下是获取字段的方法
    public String getHappy() {
        return Happy;
    }

    public void setHappy(String happy) {
        Happy = happy;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {//重写一下toString
        return "Student{" +
                "Happy='" + Happy + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

1.Class获取一个class对象的方式

获取一个class对象的方式有三种。

方式一:forName():

代码中的clazz1就是我们获取到的class对象了。

值得注意的是:

forName()中的全类名,不需要自己写,因为有时候路径名很长,自己写容易错。

我们可以用idea进行拷贝。

具体做法:

打开idea,右键Student类,选择Copy Path/Reference,点击:

然后进入这个界面,在点击Copy Reference,粘贴到forName()的参数列表中即可:

方式二:封装类.Class:

此时,clazz2也是Student的class对象。

方式三:对象.getClass:

注意,class对象只会存在一个,不会创建多个!

上述代码中的clazz1/clazz2/clazz3实际上指向的都是一个class对象:

三种方式的使用场景

第一种方式用的最多,一般都用forName()

第二种方式,一般当做一个参数进行传递        

第三种方式,在有封装类的对象时,才可以用


2.Constructor获取类的构造方法

Class类中的方法有很多,关于获取构造方法的方法就有4个。

不过好消息是,不用特意去记,因为他们的规律性极强!

助记技巧:

getConstructors()有个s,是复数形式,返回所有的公有构造方法(数组形式)

getDeclaredConstructors()多了个单词,declared,意思是声明,就是告诉编译器,他连private修饰的构造方法也要放进来

getDeclaredConstructor()和getConstructor()不带有s,是单数,所以返回一个构造方法

如果记住了这四个方法,下面获取字段和成员方法的方法基本上也就记住了。


下面是代码实操,获取类的构造方法:

1.获取所有公有构造方法:

执行结果:


2.获取所有构造方法,包括私有的:

执行结果:

此时,Student类中的所有构造方法,都在这里了。


3.获取单个构造方法:

注意:

获取单个构造方法时,

依照传入的参数个数,类型,顺序来判断具体获取到那个构造方法!

执行结果:

小细节:

如果是要获取有参构造方法,参数要与类中的一直,顺序也不能改变,并且要在类型后面点一个class,获取字节码文件。

例如:

String.class

int.class


获取这些构造方法有什么用呢?

用处可多了,可以得到他们的访问修饰权限符、构造方法的参数等等。

idea对方法的提示和填入参数的提示,底层就是用这个实现的。


4.获取访问修饰权限符

注意:

访问权限修饰符的类型使用int型表示的,具体参照表格(了解即可):

执行结果:

1正好就是public


5.获取构造方法的参数类型

执行结果:


6.用获取的构造方法创建封装类的对象

没错,既然我们可以获取封装类的构造方法,那么就可实例化一个封装类的对象.

在Constructor类中调用newInstance(构造方法的参数)方法即可:

助记技巧:
记住newInstance是一个创建对象的方法也很容易,在英文中,new就是创建的意思,
instance就是对象的意思。

执行结果:

竟然报错了!

原因是:

constructor2是一个私有的构造方法

虽然我们可以通过getDecclaredConstructor()获取这个构造方法,

但是却不能直接用

解决办法:

constructor2.setAccssible(true)——临时取消权限校验

即可。

运行结果:

3.Field获取类的字段(成员变量)

执行结果:

其他的比如,所有字段/访问权限修饰符/数据类型等,

格式和获取构造方法的方式可以说一模一样,这里就不多演示了,都是写重复的方式,所以说反射其实并不难。

比如获取name的类型:

执行结果:


另外,Field还有特有的方法,可以获取并且修改成员变量记录的值(在new了一个封装类的对象后)

运行结果:

4.Method获取类的成员方法

其实写完前三个,这个就没有什么好写的了几乎就是十以内的加减法,换着数字考你。

值得注意的是,Method类拥有独属于自己的方法,例如:
获取方法抛出的异常,

获取方法的返回值,

调用获取的方法等等。

执行结果:


以上就是这篇文章的全部内容,自己动手试试,这块内容还是很看实践的。如果可以独立把代码敲出来,说明你就掌握的差不多了。

关于反射这块内容如果还有不清楚的,小编很推荐看一下B站的黑马程序员,讲的很细节,基本都是嚼碎了,喂给你的。

B站链接:java进阶教程进阶教程

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

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

相关文章

机器学习第37周周报 GGNN

文章目录 week37 GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 数据处理部分3.2 门控图神经网络3.3 掩码操作 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 传感器设置策略4.3.2 数据集4.3.3 实验设置4.3.4 模型参数设置4.3.5 实验结果 5. 结论 …

uniapp 安卓腾讯buglyapp性能监控原生插件

插件介绍 腾讯Bugly SDK可以帮助你发现多类异常问题,如崩溃,ANR,OOM,内存使用异常,应用操作卡顿,启动耗时过长等质量问题 插件地址 安卓腾讯buglyapp性能监控原生插件 - DCloud 插件市场 使用文档 uni…

大数据BI可视化(Echarts组件)项目开发-熟悉交互API5.0

全局echarts对象 init初始化 registerTheme注册主题 var mCharts echarts.init(document.querySelector("div"), itcast)registerMap地图图表 connect 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

Vue按照顺序实现多级弹窗(附Demo)

目录 前言1. 单个弹窗2. 多级弹窗 前言 强化各个知识点&#xff0c;以实战融合&#xff0c;以下两个Demo从实战提取 1. 单个弹窗 部署按钮框以及确定的方法即可 截图如下所示&#xff1a; 以下Demo整体逻辑如下&#xff1a; 点击“生成周月计划”按钮会触发showWeekPlanDia…

【前端学习——网络相关】浏览器同源策略和跨域

浏览器的同源策略 为什么要有&#xff1f; 帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介。&#xff08;就是为了安全&#xff09; 如果非同源&#xff0c;共有三种行为受到限制 &#xff08;1&#xff09; Cookie、LocalStorage 和 IndexDB 无法读取。 &#xff08;2…

JavaScript中的DOM和BOM

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;Web API&#x1f340;1 API的概念&#x1f340;2 Web API的概念…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了&#xff0c;ubuntu24.04&#xff0c; 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前&#xff0c;虽然物质基础提高了&#xff0c;功能有独立进行编译、代码管理的服务器了。可以通过ssh登录&#xff0c;但是…

基于java,SpringBoot和Vue的智慧校园在线考试留言讨论系统设计

摘要 基于Java, SpringBoot和Vue的智慧校园在线考试留言讨论系统是一个为现代教育需求定制的Web应用&#xff0c;它结合了最新的前后端技术来提供一个互动性强、用户友好的学习和交流平台。该系统旨在通过提供实时留言和讨论功能&#xff0c;增进学生间的互动以及师生之间的沟…

第九篇:Python编程的魔法:掌握高级语法糖与技巧

Python编程的魔法&#xff1a;掌握高级语法糖与技巧 1 引言 在编程的世界里&#xff0c;"语法糖"这个术语指的是那些让代码更容易读写的语法。Python作为一个强调可读性和效率的语言&#xff0c;提供了大量的语法糖。那么为什么需要掌握Python的高级特性呢&#xff…

C++ | Leetcode C++题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution { public:int climbStairs(int n) {double sqrt5 sqrt(5);double fibn pow((1 sqrt5) / 2, n 1) - pow((1 - sqrt5) / 2, n 1);return (int)round(fibn / sqrt5);} };

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

【论文阅读笔记】Order Matters(AAAI 20)

个人博客地址 注&#xff1a;部分内容参考自GPT生成的内容 论文笔记&#xff1a;Order Matters&#xff08;AAAI 20&#xff09; 用于二进制代码相似性检测的语义感知神经网络 论文:《Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection》…

华为对于商机的判断工具(收藏):PPVVC工具

来自《LTC与铁三角∶从线索到回款》一书中不错的收藏&#xff1a; 企业的合同商务部把这个模型开发为一个工具&#xff0c;基于 痛点&#xff08; Pain &#xff09;、权力&#xff08; Power &#xff09;、构想&#xff08; Vision &#xff09;、价值 &#xff08; Value …

6层板学习笔记2

说明:笔记基于6层全志H3消费电子0.65MM间距BGA 67、多层板的电源建议直接大面积铺铜,不建议走线,铺铜充分满足其载流能力 68、凡亿推荐表层1OZ的铜厚线宽20MIL能承载1A的电流,内层0.5OZ的铜厚线宽为40MIL能承载1A的电流,过孔直径20MIL(0.5MM)能承载1A左右的电流,实际设…

《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框

1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…

FTP和NFS

一、FTP 1.FTP原理 FTP&#xff08;file Transfer Protocol&#xff0c;文件传输协议&#xff09;&#xff0c;是典型的C/S架构的应用层协议&#xff0c;由客户端软件和服务端软件两个部分共同实现文件传输功能&#xff0c;FTP客户端和服务器之间的连接时可靠的&#xff0c;面…

华为OD机试 - 执行任务赚积分 - 动态规划(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

JVM六种常见的垃圾回收器-重点含CMS过程详解

一、jdk 1.8 及其之前的分代模型: 堆内存结构必须熟悉&#xff1a;&#xff08;垃圾回收&#xff0c;性能调优常用&#xff09; 过程简单分析&#xff1a; ①年轻代和老年代在堆内存中的占比默认 1 &#xff1a;2 ②年轻代又分为两个区&#xff0c;伊甸园区(Eden)和幸存区(S0和…

给Ollama套个WebUI,方便使用

Ollama 基本的安装使用参考前文 https://xugaoxiang.com/2024/05/01/ollama-offline-deploy/&#xff0c;前文使用的模型是 llama2&#xff0c;本篇将使用 llama3&#xff0c;因此在启动时&#xff0c;命令是 ollama run llama3。 Ollama Llama3 Llama3 是 Meta 发布的大语言模…

双向链表的简单实现

目录 1. 双向链表的结构 2.双向链表的实现 2.1 初始化 2.2 增 2.2.1 尾插 ​编辑 2.2.2 头插 3.删 2.3.1 尾删 2.3.2 头删 4. 找 5.任意位置插入 5.1 任意位置前插入 ​编辑 5.2 任意位置后插入 ​编辑 6. 任意位置删除 ​编辑 7. 改 8. 链表的销毁 3. 顺序…