Java学习,反射
Java反射是Java编程语言的一个重要特性,它允许程序在运行时查看任意对象所属的类,获取类的内部信息(包括构造器、字段和方法等),并能动态地调用对象的方法或构造器。
反射概念
反射(Reflection)程序运行时能够获取类、方法、字段、构造函数等信息,并在运行时动态调用类的方法、创建对象或访问字段。Java中的反射机制主要通过java.lang.reflect包中的类来实现。
反射使用步骤
获取Class对象,反射的起点是获取类的Class对象。可以通过类名的.class方法、对象的getClass()方法或Class.forName()方法获取。
获取类的信息:通过Class对象,可以获取类的名称、包名、父类、实现的接口、构造器、字段和方法等信息。
调用类的方法:通过反射可以动态地调用类的方法,包括私有方法。但需要注意的是,调用私有方法可能会破坏封装性,应谨慎使用。
创建类的实例:通过反射可以动态地创建类的实例,这通常用于框架和插件等需要动态加载类的场景。
反射常用类和方法
Class类:表示类和接口的元数据。常用的方法有getName()、getSimpleName()、getSuperclass()、getInterfaces()、getConstructor()、getMethod()、getField()等。
Constructor类:表示类的构造方法。常用的方法有newInstance()(已过时,建议使用Constructor.newInstance(Object... initargs))、getParameterTypes()等。
Method类:表示类的方法。常用的方法有invoke(Object obj, Object... args)、getReturnType()、getParameterTypes()`等。
Field类:表示类的字段。常用的方法有get(Object obj)、set(Object obj, Object value)、getType()等。
反射应用场景
框架设计:许多Java框架(如Spring、Hibernate等)都使用了反射机制来实现动态加载和配置类、动态代理等功能。
插件系统:反射机制可以用于实现插件系统,通过动态加载插件类并调用其方法来实现插件的功能。
单元测试:在单元测试中,可以使用反射机制来动态地创建和配置测试对象,以便进行测试。
序列化和反序列化:反射机制可以用于实现对象的序列化和反序列化,将对象转换为字节流进行传输或存储。
动态代理:动态代理是Java中一种常见的设计模式,它基于反射机制实现。通过动态代理可以实现对目标对象的代理和拦截等功能。
反射的注意事项
性能问题:反射操作通常比直接操作对象的性能要低一些,因为反射需要额外的查找和解析时间。因此,在性能要求较高的场景中应谨慎使用反射。
安全性问题:反射机制可以访问类的私有属性和方法,这可能会破坏封装性并导致安全问题。因此,在使用反射时应确保代码的安全性。
可读性和可维护性问题:过度使用反射可能会使代码变得复杂和难以阅读和维护。因此,在使用反射时应权衡其带来的好处和代价。
示例:
import java.lang.reflect.Class;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 获取Class对象
Class<?> clazz = Class.forName("com.example.MyClass");
// 创建类的实例
Object obj = clazz.getDeclaredConstructor().newInstance();
// 获取方法并调用
Method method = clazz.getDeclaredMethod("myMethod", String.class);
method.invoke(obj, "Hello, Reflection!");
}
}
class MyClass {
public void myMethod(String message) {
System.out.println("MyClass.myMethod: " + message);
}
}
相关文章:
Java学习,反射
Java反射是Java编程语言的一个重要特性,它允许程序在运行时查看任意对象所属的类,获取类的内部信息(包括构造器、字段和方法等),并能动态地调用对象的方法或构造器。 反射概念 反射(Reflection)…...
数据结构 (18)数的定义与基本术语
前言 数据结构是计算机科学中的一个核心概念,它描述了数据元素之间的关系以及这些元素在计算机中的存储方式。 一、数的定义 在计算机科学中,“数”通常指的是树形数据结构,它是一种非线性的数据结构,由节点(或称为元素…...
Flink的双流join理解
如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL,通过将订单表的id和订单详情表ord…...
《使用Python进行数据挖掘:理论、应用与案例研究》
嘿,今天我要给你们介绍一本使用Python进行数据挖掘的好书。这本书是由吴迪博士撰写的,他是雷曼学院商学院的助理教授,也是数据科学的实战派。 在这个时代,数据多得让人眼花缭乱,要从中找出有用的信息,那可不…...
Go语言技巧:快速统一字符串中的换行符,解决跨平台问题
统一字符串中的 Windows \r\n 换行符 — Go语言实现 在编程中,尤其是处理跨平台的文本数据时,换行符的处理是一个常见的问题。Windows 系统使用 \r\n 作为换行符,而 Unix-like 系统(如 Linux 和 macOS)使用 \n。在 Go…...
算法训练营day20(二叉树06:最大二叉树,合并二叉树,搜索二叉树,验证搜索二叉树)
第六章 二叉树 part06 今日内容 ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树 详细布置 654.最大二叉树 又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视…...
Leetcode(区间合并习题思路总结,持续更新。。。)
讲解题目:合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间, 并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入&a…...
『python爬虫』使用docling 将pdf或html网页转为MD (保姆级图文)
目录 预览效果安装下载模型测试代码总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 预览效果 支持转化pdf的表格 安装 Docling 本身是专注于文档转换的工具,通常用于将文件(如 PDF&…...
elasticsearch现有集群扩展节点
原文地址:elasticsearch现有集群扩展节点 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 给现有的 elasticsearch 集群扩展节点比较容易,已有的集群不需要做任何修改,也不用对服务做任何处理,只需…...
力扣162:寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...
Kafka-Connect
一、概述 Kafka Connect是一个在Apache Kafka和其他系统之间可扩展且可靠地流式传输数据的工具。细心的你会发现,我们编写的producer、consumer都有很多重复的代码,KafkaConnect就是将这些通用的api进行了封装。让我们可以只关心业务部分(数…...
递归、搜索与回溯算法 - 3 ( floodfill 记忆化搜素 9000 字详解 )
一:floodfill 算法 1.1 图像渲染 题目链接:图像渲染 class Solution {// 首先先定义四个方向的向量int[] dx {0, 0, 1, -1};int[] dy {1, -1, 0, 0};// 接着用 m 记录行数,n 记录列数,prev 记录 (sr, sc) 位置的…...
YOLOv9改进,YOLOv9引入CAS-ViT(卷积加自注意力视觉变压器)中AdditiveBlock模块,二次创新RepNCSPELAN4结构
摘要 CAS-ViT 是一种为高效移动应用设计的视觉Transformer。模型通过结合卷积操作与加性自注意机制,在保持高性能的同时显著减少计算开销,适合资源受限的设备如手机。其核心组件 AdditiveBlock 通过多维度信息交互和简化的加性相似函数,实现了高效的上下文信息整合,避免了…...
HDLCPPP原理与配置
前言: 广域网中经常会使用串行链路来提供远距离的数据传输,高级数据链路控制HDLC( High-Level Data Link Control )和点对点协议PPP( Point to Point Protocol)是两种典型的串口封装协议。 HDLC协议: 原理…...
react + vite 中的环境变量怎么获取
一、Vite 环境变量基础 创建一个.env文件,Vite 定义的环境变量需要以VITE_开头。 VITE_API_URL "http://localhost:3000/api" 生产模式创建.env.production。 VITE_API_URL "https://production-api-url.com/api" 二、在 React 组件中获…...
知识蒸馏中有哪些经验| 目标检测 |mobile-yolov5-pruning-distillation项目中剪枝知识分析
项目地址:https://github.com/Syencil/mobile-yolov5-pruning-distillation 项目时间:2022年 mobile-yolov5-pruning-distillation是一个以yolov5改进为主的开源项目,主要包含3中改进方向:更改backbone、模型剪枝、知识蒸馏。这里…...
Oracle 19c RAC单节点停机维护硬件
背景 RAC 环境下一台主机硬件光纤卡不定时重启,造成链路会间断几秒,期间数据库会话响应时间随之变长,该光纤卡在硬件厂商的建议下,决定停机更换备件,为保证生产影响最小,决定停掉该节点,另外节…...
Linux系统 进程
Linux系统 进程 进程私有地址空间用户模式和内核模式上下文切换 进程控制系统调用错误处理进程控制函数获取进程 ID创建和终止进程回收子进程让进程休眠加载并运行程序 进程 异常是允许操作系统内核提供进程(process)概念的基本构造块,进程是…...
机载视频流回传+编解码方案
无线网络,低带宽场景。不能直接转发ROS raw image(10MB/s),而要压缩(编码)后再传输。可以用rtsp的udp传输或者直接传输话题,压缩方法有theora(ROS image_transport默认支持ÿ…...
Ubuntu 20.04 Server版连接Wifi
前言 有时候没有网线口插网线或者摆放电脑位置不够时,需要用Wifi联网。以下记录Wifi联网过程。 环境:Ubuntu 20.04 Server版,无UI界面 以下操作均为root用户,如果是普通用户,请切换到root用户,或者在需要权…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
