当前位置: 首页 > news >正文

Java 反射

一、基本概念

Java反射机制是Java语言的一种动态特性,允许程序在运行时检查和操作类、接口、字段和方法。反射机制使得Java程序可以在运行时获取关于类的详细信息,并且可以动态地调用类的方法、访问类的字段等。反射机制主要涉及以下几个核心类和接口:

  • Class类:每个Java类都有一个对应的Class对象,Class对象包含了与类相关的所有信息。

    主要方法:
    getFields():获取所有公共字段。
    getDeclaredFields():获取所有声明的字段,包括私有字段。
    getMethods():获取所有公共方法。
    getDeclaredMethods():获取所有声明的方法,包括私有方法。
    getConstructors():获取所有公共构造函数。
    getDeclaredConstructors():获取所有声明的构造函数,包括私有构造函数。
    getSuperclass():获取类的父类。
    getInterfaces():获取类实现的所有接口。
    
  • Field类:表示类的成员变量。

    主要方法:
    get(Object obj):获取指定对象的字段值。
    set(Object obj, Object value):设置指定对象的字段值。
    getType():获取字段的数据类型。
    getModifiers():获取字段的修饰符(如 public、private)。
    
  • Method类:表示类的方法。

    主要方法:
    invoke(Object obj, Object... args):调用指定对象的方法。
    getReturnType():获取方法的返回类型。
    getParameterTypes():获取方法的参数类型。
    getModifiers():获取方法的修饰符(如 public、private)。
    
  • Constructor类:表示类的构造方法。

    主要方法:
    newInstance(Object... initargs):创建一个新实例,使用指定的构造函数参数。
    getParameterTypes():获取构造函数的参数类型。
    getModifiers():获取构造函数的修饰符(如 public、private)。
    

二、使用反射的步骤

  1. 获取Class对象:
    获取Class对象的方式有三种:
    • 通过类名:
      Class<?> clazz = ClassName.class;
      
    • 通过对象的getClass()方法:
      Object obj = new ClassName();
      Class<?> clazz = obj.getClass();
      
    • 通过Class.forName()方法:
      Class<?> clazz = Class.forName("com.example.ClassName");
      
  2. 获取构造方法、字段和方法:
    使用Class对象可以获取类的构造方法、字段和方法。
    • 获取构造方法:
      Constructor<?> constructor = clazz.getConstructor(parameterTypes);
      
    • 获取字段:
      Field field = clazz.getField("fieldName");
      
    • 获取方法:
      Method method = clazz.getMethod("methodName", parameterTypes);
      
  3. 创建实例:
    使用构造方法创建类的实例:
    Object instance = constructor.newInstance(arguments);
    
  4. 访问字段:
    可以读取或修改对象的字段值:
    // 读取字段值
    Object value = field.get(instance);// 修改字段值
    field.set(instance, newValue);
    
  5. 调用方法:
    可以调用对象的方法:
    Object returnValue = method.invoke(instance, arguments);
    
  6. 处理访问权限:
    如果需要访问私有字段或方法,可以使用setAccessible(true)来绕过Java的访问控制检查:
    field.setAccessible(true);
    method.setAccessible(true);
    

示例代码
以下是一个简单的示例,展示如何使用反射来调用一个类的方法:

import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("com.example.MyClass");// 创建类的实例Object instance = clazz.getDeclaredConstructor().newInstance();// 获取方法Method method = clazz.getDeclaredMethod("myMethod", String.class);// 调用方法method.invoke(instance, "Hello, Reflection!");} catch (Exception e) {e.printStackTrace();}}
}

三、反射的常用操作

3.1 获取类的信息
1. 获取类名:
String className = clazz.getName();2. 获取包名:
Package packageName = clazz.getPackage();3. 获取父类:
Class<?> superClass = clazz.getSuperclass();4. 获取实现的接口:
Class<?>[] interfaces = clazz.getInterfaces();
3.2 操作类的构造方法
1. 获取构造方法:
Constructor<?>[] constructors = clazz.getConstructors();2. 调用构造方法创建对象:
Constructor<?> constructor = clazz.getConstructor(parameterTypes);
Object instance = constructor.newInstance(arguments);
3.3 操作类的字段
1. 获取字段:
Field[] fields = clazz.getFields(); // 获取所有公共字段
Field field = clazz.getDeclaredField("fieldName"); // 获取指定字段2. 访问和修改字段:
field.setAccessible(true); // 如果是私有字段,需要设置可访问
Object value = field.get(instance); // 获取字段值
field.set(instance, newValue); // 设置字段值
3.4 操作类的方法
1. 获取方法:
Method[] methods = clazz.getMethods(); // 获取所有公共方法
Method method = clazz.getDeclaredMethod("methodName", parameterTypes); // 获取指定方法2. 调用方法:
method.setAccessible(true); // 如果是私有方法,需要设置可访问
Object result = method.invoke(instance, arguments); // 调用方法

四、反射的优缺点

优点:

  • 动态性:可以在运行时动态加载类、调用方法、访问字段。
  • 灵活性:可以用于开发通用框架和库,如依赖注入框架、测试框架等。

缺点:

  • 性能开销:反射操作通常比直接调用慢,因为它涉及动态类型检查。
  • 安全性:反射可以绕过访问修饰符,可能导致安全问题。
  • 复杂性:代码可读性和可维护性较差。

相关文章:

Java 反射

一、基本概念 Java反射机制是Java语言的一种动态特性&#xff0c;允许程序在运行时检查和操作类、接口、字段和方法。反射机制使得Java程序可以在运行时获取关于类的详细信息&#xff0c;并且可以动态地调用类的方法、访问类的字段等。反射机制主要涉及以下几个核心类和接口&a…...

【目标检测01】真实框、预测框、锚框和交并比IoU

文章目录 1. 任务定义2. 基本概念2.1 边界框&#xff08;bounding box&#xff09;2.2 真实框、预测框和锚框2.3 交并比 (IoU)2.4 代码实现 1. 任务定义 目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别&#xff0c;并在该目标周围绘制边界框&#x…...

青少年编程能力等级测评CPA C++五级试卷(2)

青少年编程能力等级测评CPA C++五级试卷(2) 一、单项选择题(共15题,每题3分,共45分) CP5_2_1.下列有关类的重用方法的叙述中,不正确的是( )。 A.类的继承可以实现类的重用 B.类的组合可以实现类的重用 C.类的封装可以实现类的重用 D.类的继承和类的组合都可…...

SATA数据线

SATA 数据线&#xff08;Serial ATA 数据线&#xff09;是一种用于连接计算机主板与存储设备&#xff08;如硬盘、固态硬盘和光驱&#xff09;的线缆。它的主要作用是传输数据&#xff0c;允许计算机与这些设备之间进行高效的数据交换。 主要作用 数据传输&#xff1a;SATA 数…...

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…...

回溯算法-Java【力扣】【算法学习day.14】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…...

从本地到云端:跨用户请求问题的完美解决方案

对于某些单个请求或响应中含有多个用户信息的服务&#xff0c;SDK提供了一套基于统一的UCS拆分和聚合的解决方案供开发者使用。 请求拆分 对于跨用户服务的请求&#xff0c;我们提供了两个处理方案&#xff1a; 【1】根据用户信息拆分请求&#xff1a; 场景&#xff1a;请求内…...

leetcode day4 409+5

409 最长回文串 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解…...

英语语法学习框架(考研)

一、简单句 英语都是由简单句构成&#xff0c;简单句共有五种基本句型&#xff1a;①主谓&#xff1b;②主谓宾&#xff1b;③主谓宾宾补&#xff1b;④主谓宾间宾&#xff08;间接宾语&#xff09;&#xff1b;⑤主系表&#xff1b; 其中谓语是句子最重要的部分&#xff0c;谓…...

基于neo4j的学术论文关系管理系统

正在为毕业设计头疼&#xff1f;又或者在学术研究中总是找不到像样的工具来管理浩瀚的文献资料&#xff1f;今天给大家介绍一款超实用的工具——基于Neo4j的学术论文关系管理系统&#xff0c;让你轻松搞定学术文献的管理与展示&#xff01;&#x1f389; 系统的核心是什么呢&a…...

C#中的委托、匿名方法、Lambda、Action和Func

委托 委托概述 委托是存有对某个方法的引用的一种引用类型变量。定义方法的类型&#xff0c;可以把一个方法当作另一方法的参数。所有的委托&#xff08;Delegate&#xff09;都派生自 System.Delegate 类。委托声明决定了可由该委托引用的方法。 # 声明委托类型 委托类型声…...

IDEA关联Tomcat——最新版本IDEA 2024

1.链接Tomcat到IDEA上 添加Tomcat到IDEA上有两种方式&#xff1a; 第一种&#xff1a; &#xff08;1&#xff09;首先&#xff0c;来到欢迎界面&#xff0c;找到左侧的Customize选项 &#xff08;2&#xff09;然后找到Build、Execution、Deployment选项 &#xff08;3&am…...

【如何获取股票数据18】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股解禁限售数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…...

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备的多维拓展与灵活应用

在数字化安防时代&#xff0c;NVR批量管理软件/平台EasyNVR作为一种先进的视频监控系统设备&#xff0c;正逐步成为各个领域监控解决方案的首选。NVR批量管理软件/平台EasyNVR作为一款基于端-边-云一体化架构的国标视频融合云平台&#xff0c;凭借其部署简单轻量、功能多样、兼…...

GPT-4o 和 GPT-4 Turbo 模型之间的对比

GPT-4o 和 GPT-4 Turbo 之间的对比 备注 要弄 AI &#xff0c;不同模型之间的对比就比较重要。 GPT-4o 是 GPT-4 Turbo 的升级版本&#xff0c;能够提供比 GPT-4 Turbo 更多的内容和信息&#xff0c;但成功相对来说更高一些。 第三方引用 在 2024 年 5 月 13 日&#xff0…...

gin入门教程(10):实现jwt认证

使用 github.com/golang-jwt/jwt 实现 JWT&#xff08;JSON Web Token&#xff09;可以有效地进行用户身份验证,这个功能往往在接口前后端分离的应用中经常用到。以下是一个基本的示例&#xff0c;演示如何在 Gin 框架中实现 JWT 认证。 目录结构 /hello-gin │ ├── cmd/ …...

Python 基础语法 - 数据类型

顾名思义&#xff0c;计算机就是用来做数学计算的机器&#xff0c;因此&#xff0c;计算机程序理所当然的可以处理各种数值。但是&#xff0c;计算机能处理的远远不止数值&#xff0c;还可以处理文本&#xff0c;图形&#xff0c;音频&#xff0c;视频&#xff0c;网页等各种各…...

自托管无代码数据库Undb

什么是 Undb &#xff1f; Undb 是一个无代码平台&#xff0c;也可以作为后端即服务 (BaaS)。它基于 SQLite&#xff0c;可以使用 Bun 打包成二进制文件用于后端服务。此外&#xff0c;它可以通过 Docker 部署为服务&#xff0c;提供表管理的 UI。 软件特点&#xff1a; ⚡ 无…...

正则的正向前瞻断言和负向前瞻断言

正则的正向前瞻断言和负向前瞻断言 一. 正向前瞻断言二. 负向前瞻断言三. 总结 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 正向前瞻断言和负向前瞻断言是正则表达式中用于检查后续字…...

大厂物联网(IoT)高频面试题及参考答案

目录 解释物联网 (IoT) 的基本概念 物联网的主要组成部分有哪些? 描述物联网的基本架构。 IoT 与传统网络有什么区别? 物联网中常用的传感器类型有哪些? 描述物联网的三个主要层次。 简述物联网中数据安全的重要性 描述物联网安全的主要威胁 解释端到端加密在 IoT 中…...

react hook

react hook 最近实习有点忙&#xff0c;所以学习记录没来得及写。 HOC higher order components(HOC) 高阶组件是一个组件&#xff0c;接受一个参数作为组件&#xff0c;返回值也是一个组件的函数。高阶组件作用域强化组件&#xff0c;服用逻辑&#xff0c;提升渲染性能等。…...

Jetpack架构组件_LiveData组件

1.LiveData初识 LiveData:ViewModel管理要展示的数据&#xff08;VM层类似于原MVP中的P层&#xff09;&#xff0c;处理业务逻辑&#xff0c;比如调用服务器的登陆接口业务。通过LiveData观察者模式&#xff0c;只要数据的值发生了改变&#xff0c;就会自动通知VIEW层&#xf…...

Etcd 可观测最佳实践

简介 Etcd 是一个高可用的分布式键值存储系统&#xff0c;它提供了一个可靠的、强一致性的存储服务&#xff0c;用于配置管理和服务发现。它最初由 CoreOS 开发&#xff0c;现在由 Cloud Native Computing Foundation (CNCF) 维护。Etcd 使用 Raft 算法来实现数据的一致性&…...

钉钉录播抓取视频

爬取钉钉视频 免责声明 此脚本仅供学习参考&#xff0c;切勿违法使用下载他人资源进行售卖&#xff0c;本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…...

centos下面的jdk17的安装配置

文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功&#xff0c;查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…...

【操作系统】——调度

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 处理机调度的概念、层次 进程调度的时机、切换与过程、方式 调度器和闲逛进程 处理机调度的概念、层…...

基于Aspose依赖添加自定义文本水印——Word、Pdf、Cell

基于Aspose依赖添加自定义文本水印——Word、Pdf、Cell 所需依赖Word水印Pdf水印——&#xff08; 注意 pdf 存在找不到字体的问题&#xff09;Excel水印 所需依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId&g…...

【C++】—掌握STL string类:字符串操作的得力助手

#1024程序员节&#xff5c;征文# 文章目录 繁星点点映夜空&#xff0c;晨曦微露照前程1.string的基本概念2.标准库中的string类2.1 string类2.2 auto和范围for2.3 string类常用的接口2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.6 string类对象的修改操作2…...

【Java笔记】第十四章:异常

一、概念【理解即可】 1. 异常&#xff1a;程序运行过程中&#xff0c;出现的非正常情况。 2. 异常的处理&#xff1a;当异常出现时&#xff0c;执行一段预先准备好的代码。 3. 异常的处理的必要性&#xff1a;减少用户的损失、同时减小给用户带来麻烦&#xff0c;也可以对用…...

Python游戏开发超详细(基础理论知识篇)

一、引导&#xff1a; Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python&#xff0c;你可以利用其强大的库和框架来创建各种类型的游戏&#xff0c;从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识&#xff0c;帮助你入门Python游戏开发。 二、理论知识…...

阿里巴巴网站运营怎么做/网站是怎么优化推广的

此处代码为了实现手风琴效果&#xff0c;效果实现为&#xff0c;鼠标移动每一个组件上&#xff0c;背景&#xff08;并不是真的背景&#xff09;也会移动到当前组件上&#xff0c;鼠标离开后&#xff0c;再回到起始位置点&#xff0c;若点击&#xff0c;停留在当前位置。此单航…...

可以做ppt的网站有哪些/网店运营的工作内容

在项目中经常遇到要动态生成控件&#xff0c;动态显示指定的控件或者隐藏&#xff0c;这就要涉及到查找控件的问题。 下面介绍下Winform中使用控件名来查找窗体或者容器中的控件的方法&#xff0c;代码如下&#xff1a; /// <summary> /// 通过控件名获取控件…...

创建wordpress用户访问数据库/网站排名怎么做上去

#所有防火墙规则都放到一个shell脚本里&#xff0c;调整后就执行一遍。 #!/bin/sh #首先先清空所有规则 /sbin/iptables -F #-F: FLASH&#xff0c;清空规则链 #for local /sbin/iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #或者 /sbin/iptables -A INPUT -…...

网站设计网站建设专业/百度app下载官方免费下载安装

目录 单点登录简介SSO&CAS是什么单点登录适合什么场景单点登录的三种实现方式CAS的几个重要知识点CAS的实现过程单点登录简介 单点登录(SingleSignOn&#xff0c;SSO)&#xff0c;就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后&#xff0c;即可获…...

网站建设试用/网站seo属于什么专业

通过UIPageControl和UIScrollView的结合实现滑动翻页的效果时默认显示的时第一个view&#xff0c;而大多数时候我们可能 需要将第二个或者第三个view作为默认页显示&#xff0c;而这时仅仅设置currentPage是不够的&#xff0c;它只能改变页面指示器的颜色&#xff0c; 并不会完…...

4在线做网站/百度官网电话

高德地图右键菜单类ContextMenu&#xff0c;在实际应用中为了交互更方便有时不仅需要地图的右键菜单&#xff0c;还需要在marker、circle、polyline、polygon上添加右键菜单&#xff0c;我采用ContextMenu类实现&#xff0c;以polygon为例&#xff0c;通过响应”rightclick”事…...