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.rhkb.cn/news/304341.html

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

相关文章

Vue3---基础1(认识,创建)

变化 相对于Vue2,Vue3的变化: 性能的提升 打包大小减少 41% 初次渲染快 55%,更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…

PHP 伪协议:使用 php://input 访问原始 POST 数据

文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议? php://input为什么需要 php://input?更灵活的数据处理减小性能压力 发送 POST 数据HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 基操 enable_post_data_…

Linux——fork复制进程

1)shell: 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…

SpringBoot中的Redis的简单使用

在Spring Boot项目中使用Redis作为缓存、会话存储或分布式锁等组件,可以简化开发流程并充分利用Redis的高性能特性。以下是使用Spring Boot整合Redis的详细步骤: 1. 环境准备 确保开发环境中已安装: Java:用于编写和运行Spring…

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据,说明网关已生效,其原理流程图如下: 二、网关过滤器 作用:处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类: a. 某个路由的过滤器 …

LeetCode Meditations:合并 K 排序列表

描述 合并K分类列表 状态: 您有一系列 k 链接-列表 lists ,每个链接-列表按升序排序。 合并所有链接-列表为一个排序的链接-列出并返回。 例如: Input: lists [[1, 4, 5], [1, 3, 4], [2, 6]] Output: [1, 1, 2, 3, 4, 4, 5, 6] Explanatio…

地理信息系统(ArcGIS)在水文水资源、水环境中的应用

刘老师(副教授):来自北京重点高校资深专家,长期从事水资源与水环境、流域污染控制与管理、非点源模拟与控制、环境信息系统开发、环境遥感与GIS应用等领域的研究,发表多篇Sci论文、具有资深的技术底蕴和专业背景。 1、…

MapTracker:Tracking with Strided Memory Fusion for Consistent Vector HD Mapping

参考代码:MapTracker 动机与出发点 为了提升帧间检测的稳定性通常会添加时许信息,这个可以BEV特征处做时序融合,也可以是用当前帧query去cross-attn历史帧信息,则更多的时候是将之前帧信息与当前做融合或者cross-attn实现信息传…

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样,并且12页面报错或者页面部分数据显示不正常,那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询: 猜解列名 ?id1) order by 3-…

SIC知识--(1):来龙去脉

一、碳化硅的起源 1891年,当时爱德华古德里奇艾奇逊在尝试制造人造金刚石的过程中意外发现了这一材料。艾奇逊将黏土(铝硅酸盐)与粉状焦炭(碳)混合后在电炉中加热,预期得到金刚石,却意外获得了一…

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

Mac安装配置ElasticSearch和Kibana 8.13.2

系统环境&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) 一、准备 从Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic上下载ElasticSearch和Kibana 笔者下载的是 elasticsearch-8.13.2-darwin-aarch64.tar.gz kibana-8.13.2-darwin-aarch64.tar.gz 并放置到个人…

关于ASP.NET Core WebSocket实现集群的思考

前言 提到WebSocket相信大家都听说过&#xff0c;它的初衷是为了解决客户端浏览器与服务端进行双向通信&#xff0c;是在单个TCP连接上进行全双工通讯的协议。在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询&#xff0c;来实现服务端的变更响应到客户端&…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

机器学习实训 Day1

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

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

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

Harmony鸿蒙南向驱动开发-PWM

PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff0c;是一种对模拟信号电平进行数字编码并将其转换为脉冲的技术&#xff0c;广泛应用在从测量、通信到功率控制与变换的许多领域中。通常情况下&#xff0c;在使用马达控制、背光亮度调节时会用到PWM模…

数据降维方法-主成分分析(PCA)

目录 一、前言 二、向量的表示及基变换 三、基变换 四、协方差矩阵 五、协方差 六、优化目标 一、前言 主成分分析(Principal Component Analysis) 用途&#xff1a;降维中的常用手段 目标&#xff1a;提取最有价值的信息&#xff08;基于方差&#xff09; 问题&#x…

Acwing.4009 收集卡牌(期望dp)

题目 小林在玩一个抽卡游戏&#xff0c;其中有 n种不同的卡牌&#xff0c;编号为 1到 n。 每一次抽卡&#xff0c;她获得第 i种卡牌的概率为 pi。 如果这张卡牌之前已经获得过了&#xff0c;就会转化为一枚硬币。 可以用 k枚硬币交换一张没有获得过的卡。 小林会一直抽卡&…

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

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