Java零基础入门-Java反射机制

 一、概述

        我们都听说过java有个反射机制,通过反射机制我们可以更深入的控制程序的运行过程。例如,在程序进入到运行期间,由用户输入一个类名,然后我们可以动态获取到该类拥有的所有类结构、属性名和方法,甚至还可以任意调用类的任意方法。听起来是不是很牛?我也觉得比较牛,挺有意思的,所以对于不太熟悉的小伙伴而言,那就来听我一一道来。

        所以此期我们就来重点学习一下java的反射机制。

二、本期教学目标

  • 了解什么是反射?
  • 了解反射的优缺点
  • 熟悉通过反射获取java对象的方法
  • java常用的反射机制api
  • java通过反射执行方法
  • 反射实例演示

三、正文

        本文首先介绍一下java中class类与java反射的基础用法,然后再结合应用具体介绍反射。

1️⃣概念

        什么是反射?在介绍反射之前,我们先来了解两个概念,编译器和运行期。

  1. 编译器:编译器是把源代码交给编译器编译成计算机可执行的字节码文件的过程。
  2. 运行期:运行期是把编译好的字节码文件交给计算机(在内存)去执行的过程,直到运行结束。

        而java反射,就是在程序处于运行状态中,对于任意一个类,都能够动态的获取到这个类的所有属性、方法;对于任意一个对象,都能调用它的任意方法和内部属性。这种动态获取信息以及动态调用对象方法属性的功能就被成为java的反射机制。总而言之,java反射指的是程序在运行时能获取自身的所有信息,比如类名、类路径、包路径、构造方法、私有属性等等。

        所以对于java程序,只要你给定一个类名,你就可以通过java反射获取到该类的所有信息。

2️⃣功能

        对于java反射机制而言,它主要提供了以下功能,且这些功能都位于java.lang.reflect包中。

如下是对于程序中,该reflect截图。

         如下我就给大家诺列以下:

  • 获取任意一个对象所属的类(运行期)
  • 构造任意一个类的对象(运行期)
  • 判断任意一个类所具有的成员变量和方法(运行期)
  • 调用任意一个对象的方法(运行期)
  • 生成动态代理。

         而想要知道一个类的属性和方法,你必须先获取到该类的字节码文件对象。获取类信息时,使用的就是class类的方法。所以你先要获取到每一个字节码文件对应的class类型对象。比如:

 Class aClass = dog1.getClass();

3️⃣常用Api

        利用class类的对象aClass可以获取到的该类的所有信息,比如类信息、Object信息。如下是列举出来的是通过反射可获取到的常用信息,具体如下:

  • getPackage():获取该类的存放路径。
  • getName():获取该类的名称。
  • getSuperclass():获取该类继承的类
  • getlnterfaces():获取该类实现的所有接口
  • getMethods():获取所有权限为 public 的方法
  • getDeclaredMethods():获取当前对象的所有方法
  • getClasses():获取所有权限为 public 的内部类
  • getFields():获取所有权限为 public 的成员变量

4️⃣优缺点

        对于反射,虽然利大于弊,但是不排除任意一个东西开发出来,都没有任何缺点。比如对于java的反射机制。

  • 优点:能够程序运行时动态获取类的实例,大大提高了系统的灵活性和扩展性。且对于java先编译后运行的机制而言,更加方便灵活创建代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加的贴切面向对象。
  • 缺点:反射会消耗一定的系统资源。因此如果不需要动态的创建一个对象,那就不需要使用反射。而且通过反射手法,在调用对象方法时可以忽略权限检查就能获取到该类的私有属性私有方法,可能会导致破坏类的封装性而导致安全问题。

5️⃣实例演示

        如下我就通过列举一个类通过实例化后来通过反射机制来动态获取该对象的一些信息。

具体演示代码如下:

@Data
public class Dog extends Animal {//子类private String active;@Overridepublic void eat() {System.out.println("我是狗狗,吃骨头!");}//独有功能public void lockHome() {System.out.println("我是狗狗,我会看家");}
}

然后我再来定义一个main函数进行测试获取一下该对象名称:

    public static void main(String[] args) {Animal dog = new Dog();//向上转型Class dogClass = dog.getClass();System.out.println("该类的名称为:"+dogClass.getName());}

运行截图如下: 

 获取该dog对象包名:

    public static void main(String[] args) {Animal dog = new Dog();//向上转型Class dogClass = dog.getClass();System.out.println("该类的包名为:"+dogClass.getPackage());}

运行截图如下: 

 获取该dog对象的所有方法。

    public static void main(String[] args) {Animal dog = new Dog();//向上转型Class dogClass = dog.getClass();Method[] methods = dogClass.getDeclaredMethods();System.out.println("该类的所有方法为:"+methods);}

运行截图如下:  

获取所有权限为 public 的内部类。

    public static void main(String[] args) {Animal dog = new Dog();//向上转型Class dogClass = dog.getClass();Class[] classes = dogClass.getClasses();System.out.println("获取所有权限为public 的内部类:" + classes);}

运行截图如下: 

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

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

相关文章

Java快速入门系列-9(Spring框架与Spring Boot —— 深度探索及实践指南)

第九章:Spring框架与Spring Boot —— 深度探索及实践指南 9.1 Spring框架概述9.2 Spring IoC容器9.3 Spring AOP9.4 Spring MVC9.5 Spring Data JPA/Hibernate9.6 Spring Boot快速入门与核心特性9.7 Spring Boot的自动配置与启动流程详解9.8 创建RESTful服务与数据库交互实践…

专为苹果系统设计的精美可视化图表 | 开源日报 No.219

danielgindi/Charts Stars: 27.3k License: Apache-2.0 Charts 是为 iOS/tvOS/OSX 提供美观图表的开源项目,是跨平台 MPAndroidChart 在苹果设备上的实现。该项目提供了以下主要功能和优势: 支持 iOS、tvOS 和 macOS 平台使用 Swift 编写,可…

Ceph学习 -6.Nautilus版本集群部署

文章目录 1.集群部署1.1 环境概述1.1.1 基础知识1.1.2 环境规划1.1.3 小结 1.2 准备工作1.2.1 基本环境1.2.2 软件安装1.2.3 小结 1.3 Ceph部署1.3.1 集群创建1.3.2 部署Mon1.3.3 小结 1.4 Ceph部署21.4.1 Mon认证1.4.2 Mgr环境1.4.3 小结 1.5 OSD环境1.5.1 基本环境1.5.2 OSD实…

数据结构-移除元素(简单)

题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

可视化大屏的应用(11):智慧运维领域的得力助手

一、什么是智慧运维 智慧运维(Smart Operations and Maintenance,简称智慧运维)是一种利用先进的信息技术和数据分析手段,对设备、设施或系统进行监测、分析和优化管理的运维方式。它通过实时监测数据、智能分析和预测&#xff0…

Redis中的集群(五)

集群 在集群中执行命令 MOVED错误。 当节点发现键所在的槽并非由自己负责处理的时候&#xff0c;节点就会向客户端返回一个MOVED错误&#xff0c;指引客户端转向至正在负责槽的节点&#xff0c;MOVED错误的格式为: MOVED <slot> <ip>:<port>其中slot为键…

centos 7.9 nginx本地化安装,把镜像改成阿里云

1.把centos7.9系统切换到阿里云的镜像源 1.1.先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2.下载新的CentOS-Base.repo配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo特别…

盲人独立出行的新里程:“盲人软件”赋能无障碍生活

作为一名资深记者&#xff0c;我始终致力于探索并分享那些以科技之力提升特殊群体生活质量的故事。最近&#xff0c;一款名为蝙蝠避障的盲人软件进入了我的视野&#xff0c;其强大的避障导航功能正悄然改变着视障人士的出行方式&#xff0c;赋予他们前所未有的独立生活能力。 …

【多线程】线程池Future和FutureTask

【多线程】线程池Future和FutureTask 【一】Future概述【1】Future的出现原因【2】Future结构图 【二】Future详解【1】Future接口源码【2】Future的5个方法【3】ThreadPoolExecutor提供了三个方法&#xff0c;来获取返回值&#xff08;1&#xff09;submit(Runnable r)&#x…

【ARM 裸机】汇编 led 驱动之原理分析

1、我们为什么要学习汇编&#xff1f;&#xff1f;&#xff1f; 之前我们或许接触过 STM32 以及其他的 32 位的 MCU ,都是基于 C 语言环境进行编程的&#xff0c;都没怎么注意汇编&#xff0c;是因为 ST 公司早已将启动文件写好了&#xff0c;新建一个 STM32 工程的时候&#…

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果

图像生成:Pytorch实现一个简单的对抗生成网络模型

图像生成&#xff1a;Pytorch实现一个简单的对抗生成网络模型 前言相关介绍具体步骤准备并读取数据集定义生成器定义判别器定义损失函数定义优化器开始训练完整代码 训练生成的图片 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&…

实战Java高并发程序设计课

课程介绍 实战Java高并发程序设计课是一门针对Java开发者的培训课程&#xff0c;重点关注如何设计和优化高并发的程序。学员将学习到并发编程的基本概念、线程池的使用、锁机制、并发集合等技术&#xff0c;并通过实际案例进行实践操作。这门课程旨在帮助开发者掌握并发编程的…

最祥解决python 将Dataframe格式数据上传数据库所碰到的问题

碰到的问题 上传Datafrane格式的数据到数据库 会碰见很多错误 举几个很普遍遇到的问题(主要以SqlServer举例) 这里解释下 将截断字符串或二进制数据 这个是字符长度超过数据库设置的长度 然后还有字符转int失败 或者字符串转换日期/或时间失败 这个是碰到的需要解决的最多的问…

Java面试题戏剧

目录 第一幕 、第一场&#xff09;某大厦楼下大门前第二场&#xff09;电梯中第三场&#xff09;走廊中 第二幕、第一场&#xff09;公司前台第二场&#xff09;公司卫生间 第三幕、第一场&#xff09;一场异常面试 第四幕 、第一场&#xff09;大厦楼下门口第二场&#xff09;…

Lobe UI - 基于 AntDesign 开发的 AIGC Web 应用的开源 UI 组件库

今天推荐一个可以快速开发 ChatGPT UI 界面的组件库&#xff0c;质量很高&#xff0c;拿来就能用。 Lobe UI 是由 lobehub 团队开发的一套 web UI 组件库&#xff0c;和我之前推荐的很多通用型的 UI 组件库不同&#xff0c;Lobe UI 是专门为目前火热的 AIGC 应用开发而打造&am…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…

马云最新发声:AI时代刚刚到来,一切才刚开始,我们正当其时!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

3. Spring 注解存储对象 Bean的命名规范

从Java5.0开始&#xff0c;Java开始支持注解。Spring做为Java生态中的领军框架&#xff0c;从2.5版本后也开始支持注解。相比起之前使用xml来配置Spring框架&#xff0c;使用注解提供了更多的控制Spring框架的方式。 SpringFramework版本对应jdk版本重要特性SpringFramework 1…

Unity之Unity面试题(五)

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之Unity面试题&#xff08;五&#xff09; TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取…