【Java寒假打卡】Java基础-反射

news2024/12/23 13:33:29

【Java寒假打卡】Java基础-反射

    • 概述
    • 获取Class对象的三种方式
    • 反射-获取Constructor对象
    • 利用Constructor数组创建对象
    • 获取Field对象
    • 反射获取成员变量并且使用
    • 反射获取成员对象
    • 反射获取成员对象并运行

概述

Java反射机制:是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能调用它的任意属性和方法;这种动态获取信息以及动态调用对象的方法的功能称之为Java语言的反射机制。

在这里插入图片描述

使用反射创建对象的时候,不管类中成员变量的修饰符是public还是private,都可以进行直接调用

Java反射机制:利用反射可以无视修饰符获取类里面所有的属性和方法。先获取配置文件中的信息,动态获取信息并创建对象和调用方法

获取Class对象的三种方式

package com.hfut.edu.test17;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {

        // 获取class对象的三种方式

        // class类中的静态方法forName("全类名“)
        Class clazz = Class.forName("com.hfut.edu.test17.Student");
        System.out.println(clazz);

        // 通过class属性来获取
        Class clazz2 = Student.class;
        System.out.println(clazz2);

        // 利用对象的getClass方法来获取class对象
        Student s = new Student();
        Class clazz3 = s.getClass();

    }
}


  • Class.forName(“全类名”);
  • 类名.class
  • 对象.getClass()

反射-获取Constructor对象

package com.hfut.edu.test17;

import java.lang.reflect.Constructor;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {

        // 获取Class对象
        Class clazz = Class.forName("com.hfut.edu.test17.Student");

        // 获取所有公共构造方法对象的数组
        Constructor[] constructors = clazz.getConstructors();

        // 使用增强for循环进行遍历
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        // 获取所有构造方法的对象数组
        Constructor[] constructors1 = clazz.getDeclaredConstructors();// 私有构造方法也会获取
        for (Constructor constructor : constructors1) {
            System.out.println(constructor);
        }

        // 获取单个构造方法  无参构造方法
        Constructor constructor2 = clazz.getConstructor();
        System.out.println(constructor2);

        // 获取指定参数的有参数构造方法
        Constructor constructor3 = clazz.getConstructor(int.class,String.class);
        System.out.println(constructor3);

    }
}


在这里插入图片描述

利用Constructor数组创建对象

在这里插入图片描述

package com.hfut.edu.test17;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        // 获取Class对象
        Class clazz = Class.forName("com.hfut.edu.test17.Student");

        // 获取有参数的构造方法对象
        Constructor constructor = clazz.getConstructor(int.class,String.class);

        // 使用newInstance创建Stduent对象
        Student stduent = (Student)constructor.newInstance(23,"ehwiuehwiu");

        System.out.println(stduent);
        
    }
}


获取Field对象

在这里插入图片描述

package com.hfut.edu.test17;

import java.lang.reflect.Field;

public class test1 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 获取class对象
        Class clazz = Class.forName("com.hfut.edu.test17.Student");
        
        // 获取Fiele对象
        Field[] f = clazz.getFields();// 获得Field对象

        for (Field field : f) {
            System.out.println(field);
        }

        // 返回所有的成员对象
        Field[] f1 = clazz.getDeclaredFields();
        for (Field field : f1) {
            System.out.println(field);
        }
    }
}


反射获取成员变量并且使用

在这里插入图片描述


package com.hfut.edu.test17;

import javax.xml.stream.events.StartDocument;
import java.lang.reflect.Field;

public class test1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        // 获取class对象
        Class clazz = Class.forName("com.hfut.edu.test17.Student");
        
        // 获取Fiele对象
        Field f = clazz.getField("name");// 获得Field对象  指定参数

        // 创建一个Student对象
        Student student = (Student) clazz.newInstance();

        // 使用field对指定对象进行赋值
        f.set(student,"zhangds");
        System.out.println(student);


    }
}


反射获取成员对象

在这里插入图片描述

反射获取成员对象并运行

在这里插入图片描述

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

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

相关文章

使用VS code快速搭建一个Golang项目

文章目录前言安装go语言环境了解Go开发相关的环境变量熟悉Go Module创建一个go项目项目迁移前言 VC code是一款巨好用的编辑器,使用vs code开发项目需要进行一些配置。项目中需要用到很多的包,无论是自己建的还是第三方的。由于go语言的生态环境没有jav…

【路由器连接天翼网关2.0问题解决思路】

文章目录一. 天翼网关如何切换新账号?背景操作流程1. 拔掉光纤2. 重置光猫3. 管理员页面进行认证4. 重新插上光纤,管理员页面会显示认证成功二、路由器连接光猫无网如何解决?背景操作流程1. 登陆普通管理员2. 获取超级管理员3. 登陆超级管理页…

SOLIDWORKS Electrical 2023新功能

电气工程师在完成电气原理图设计的同时,还需要频繁地修改、导出各报表,使得大量时间浪费在重复性的手动工作上。即便如此,也无法保证百分百准确无误;电气设计部门和机械设计部门虽然在设计同一产品,但不同部门之间互相…

云原生|kubernetes|2022年底cks真题解析(11-16)

前言: 接上一篇文章:云原生|kubernetes|2022年底cks真题解析(1-10)_晚风_END的博客-CSDN博客 2022年底的csk真题第二部分 11题到16题 十一, Trivy 扫描镜像安全漏洞 题目: Task 使用 Trivy 开源容器扫…

神奇的HTML系列专栏总目录

📋 前言 🖱 博客主页:在下马农的碎碎念✍ 本文由在下马农原创,首发于CSDN📆 首发时间:2023/01/16📅 最近更新时间:2023/01/16🤵 此马非凡马,房星本是星。向前…

《Linux性能优化实战》学习笔记 Day02

02 | 内存池:如何提升内存分配的效率? 原文摘抄 在 Linux 系统中,用 Xmx 设置 JVM 的最大堆内存为 8GB,但在近百个并发线程下,观察到 Java 进程占用了 14GB 的内存。为什么会这样呢? 绝大部分高级语言都…

【图论】「极简复习版」最短路径 Java/C++ 实现

文章目录Dijkstra —— 单源最短路讲解图解Java朴素使用堆优化C朴素使用堆优化Floyd —— 多源最短路讲解JavaCDijkstra —— 单源最短路 讲解 时间复杂度 朴素 Dijkstra:O(n2)O(n^2)O(n2) ,nnn 是顶点数。堆优化 Dijkstra:O(mlogn)O(m\ l…

第五届字节跳动青训营 前端进阶学习笔记(三)CSS基本概念

文章目录前言CSS是什么1.CSS基本结构2.在面中使用CSS的方式3.CSS是如何工作的选择器1.通配选择器2.标签选择器3.id选择器4.类选择器5.属性选择器6.伪类选择器7.选择符颜色1.RGB颜色2.HSL颜色3.alpha透明度字体1.font-family2.font-size3.line-height4.text-align5.space6.text-…

从头搭建pytorch Docker镜像

目录前言正文从docker hub下载镜像创建容器并运行更新容器*安装python*安装anaconda安装pytorch参考文献:前言 此文不需要前言,请从正文开始 开始搭建 正文 默认大家都是有一定docker基础的,没有的话建议去花个20分钟学一下基础知识。相对…

如何利用极狐GitLab 轻松管理NPM依赖发布与更新?

本文来自: 任治桐 极狐(GitLab) 前端工程师 NPM 是 Node.js 的包管理工具,用来安装各种 Node.js 的扩展。本文将分享如何通过极狐GitLab,让 NPM 依赖发布更新更加快速和自动化,让你轻松管理依赖,拥有更多时间专注于核…

【Java|golang】1814. 统计一个数组中好对子的数目

给你一个数组 nums &#xff0c;数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) 321 &#xff0c; rev(120) 21 。我们称满足下面条件的下标对 (i, j) 是 好的 &#xff1a; 0 < i < j < nums.length nums[i] rev(…

算法之美~时间复杂度

时间复杂度 时间复杂度的全称是渐进时间复杂度&#xff0c;表示算法的执行时间与数据规模之间的增长关系1、只关注循环执行次数最多的一段代码2、加法法则&#xff1a;总复杂度等于量级最大的那段代码的复杂度3、乘法法则&#xff1a;嵌套代码的复杂度等于嵌套内外代码复杂度的…

文末有福利 | 零代码连接邮箱腾讯云企业网盘,附件管理超轻松

在日常工作中&#xff0c;想必大家每天都会收到各种各样的工作邮件&#xff0c;并且很多重要的文件材料也是通过邮件附件的形式来传输的&#xff0c;那么如何一站式管理这些文件&#xff0c;对于提高办公效率就至关重要了。关于邮件附件&#xff0c;相信大家也都碰到过这样的困…

【软件相关】Typora配置图片上传

文章目录0 前言1 确定需求2 开始配置2.1 软件储备2.2 插件安装2.3 gitee配置3 其他配置3.1 获取SMMS token参考链接0 前言 对于喜欢写Markdown文档的人来说&#xff0c;Typora无疑是一个写作利器&#xff0c;它有别于其他的Markdown软件&#xff0c;不是一边编辑一边渲染&#…

excel区分工时制度:如何计算996与955的工时差异

什么是996呢&#xff1f;是指早上9点上班&#xff0c;晚上9点下班&#xff0c;中午和晚上各有1小时吃饭时间&#xff0c;每周工作6天的工作模式。而955&#xff0c;也就是朝九晚五&#xff0c;中午就餐在工作时间内&#xff0c;但不能休息&#xff0c;共计8小时工作时间&#x…

[FUNC]在AHK中实现Pyhton的range函数

本文是用AutoHotkey复刻Python的range函数函数语法range(start, stop, step)参数说明&#xff1a;参数描述start计数从 start 开始。默认是从 0 开始。例如&#xff1a;range&#xff08;6&#xff09;等价于range(0,6)。stop计数到 stop 结束&#xff0c;但不包括 stop。例如&…

5、Ubuntu20常用操作_进程管理重定向和管道常用命令网络管理

进程管理 进程的概念 大家比较熟悉 Windows 下的可执行文件&#xff0c;就是那些扩展名为exe的文件。 大家知道&#xff0c;只需要鼠标双击这些程序&#xff0c; 就可以运行了。 程序运行起来后&#xff0c;我们把这个程序正在运行的 实例 称之为 进程 。 操作系统对每个进…

acwing86场周赛题解(模拟,dp,数学推导式)

目录 第一题&#xff1a;AcWing 4794. 健身 思路 核心代码 完整代码 第二题&#xff1a;4795. 安全区域 思路 核心代码 完整代码 第三题&#xff1a;4796. 删除序列 思路 核心代码 完整代码 谢谢您的阅读 第一题&#xff1a;AcWing 4794. 健身 4794. 健身 李华…

配置与管理DNS服务器

DNS概念 DNS是一种新的主机名称和IP地址转换机制&#xff0c;使用分层的分布式数据库来处理Internet上众多的主机和IP地址转换。当一个应用需要将域名翻译成为IP地址时&#xff0c;这个应用便成为域名系统的一个客户。这个客户将待翻译的域名放在一个DNS请求信息中&#xff0c;…

CHAPTER 10 Web服务与应用(二)

Web服务与应用10.1 Tomcat10.1.1 准备工作10.1.2 编写dockerfile10.1.3 创建tomcat用户和密码脚本文件10.1.4 编写启动脚本10.1.5 创建和测试镜像10.1.6 相关资源10.2 Jetty10.2.1 使用官方镜像10.2.2 相关资料10.3 LAMP10.3.1 使用官方镜像10.4 持续开发与管理10.4.1 Jenkins及…