反射概率以及一些基本API的使用
请问,获取对象有几种方式?
1、通过构造函数来new一个对象;
2、通过clone来克隆一个对象;
3、通过序列化反序列化来构建一个对象;
4、通过反射来创建对象;a、通过Class类来创建;b、通过Constructor类来创建;
什么是反射
JAVA反射机制是指在运行状态(非编译状态)中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
说的直白点,就是我们可以通过反射机制,来把类的各个组成部分(属性、构造函数、方法)给获取到。
反射能干嘛?
1:获取类的相关信息
2:动态调用方法
3:动态构造对象
Class类
我们发现该类没有构造函数,我们可以通过forName静态方法来获取到类对象。
Class类提供的API分类
获取到类信息的相关方法
获取到类中属性相关的方法
获取到类中方法相关的方法
获取到类中构造器相关的方法
反射相关类的简介
此处并没有列出这三个类中的所有方法, 只是这几个方法能够反映出该类的特点, 具体方法请参考API文档。
Field代表类的成员变量(成员变量也称为类的属性)
Method代表类的方法
Constructor类
反射案例:反射操作Book类
反射操作的Book类
class Book{//提供一个公开访问权限的属性public int bid;//提供一个私有的属性;private String bname;//提供一个默认的属性double price;//构建多个不同参数的构造函数public Book() {System.out.println("这是无参构造函数");}public Book(String bname) {this.bname = bname;System.out.println("这是一个参数构造函数");}public Book(int bid, String bname) {this.bid = bid;this.bname = bname;System.out.println("这是两个参数构造函数");}//构建两个方法,分别是私有的和共有的方法public void read(String bname) {System.out.println(bname+"这是一本好书,需要好好读!");}private void write(String content) {System.out.println("我在写一本书,这本书的内容是:"+content);}public String getBname() {return bname;}public void setBname(String bname) {this.bname = bname;}@Overridepublic String toString() {return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";}
}
三种方法获得字节码对象
//获取到类的字节码对象//1、通过Class.forName来获取到指定路径下的类的字节码对象Class<?> classObj1 = Class.forName("lession14.reflect.Book");//2、通过对象来获取Book bookObj2 = new Book();Class<?> classObj2 =bookObj2.getClass();//3、通过类来获取到指定类的字节码对象Class<?> classObj3 = Book.class;//1.1、我们可以通过字节码对象来做哪些事情//1.1.1、获取到实例对象Book bookObj1 = (Book)classObj1.newInstance();System.out.println(bookObj1);//1.1.2、获取到类的相关信息System.out.println(classObj1.getName());System.out.println(classObj1.getPackage());
操作属性,构造函数以及方法
public class ReflectDemo {public static void main(String[] args) throws Exception {//获取到类的字节码对象//1、通过Class.forName来获取到指定路径下的类的字节码对象Class<?> classObj1 = Class.forName("lession14.reflect.Book");//2、通过对象来获取Book bookObj2 = new Book();Class<?> classObj2 =bookObj2.getClass();//3、通过类来获取到指定类的字节码对象Class<?> classObj3 = Book.class;//1.1、我们可以通过字节码对象来做哪些事情//1.1.1、获取到实例对象Book bookObj1 = (Book)classObj1.newInstance();System.out.println(bookObj1);//1.1.2、获取到类的相关信息System.out.println(classObj1.getName());System.out.println(classObj1.getPackage());//1.1.3、获取到相关的属性对象//1.1.4、获取到相关的方法对象//1.1.5、获取到相关的构造函数对象//4、通过字节码对象和对应的实例对象来操作他们的属性
// operateField(classObj1,bookObj1);//5、通过字节码对象和对应的实例对象来操作他们的构造函数
// operateConstructor(classObj1,bookObj1);//4、通过字节码对象和对应的实例对象来操作他们的方法operateMethod(classObj1,bookObj1);}private static void operateMethod(Class<?> classObj, Book book) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//1、获取到一个公有方法Method read = classObj.getMethod("read", String.class);System.out.println(read.getName());//2、调用该方法read.invoke(book, "红楼梦");//3、获取到私有方法Method write = classObj.getDeclaredMethod("write", String.class);write.setAccessible(true);write.invoke(book, "今天天气真好");//4、获取所有方法Method [] methods = classObj.getDeclaredMethods();for(Method method:methods) {System.out.println(method.getName());}}private static void operateConstructor(Class<?> classObj, Book book) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//1、使用字节码对象来调用无参的构造函数对象Constructor<?> constructor = classObj.getConstructor();//查看下构造函数对象System.out.println(constructor);//2、通过刚刚创建的无参构造函数对象来创建一个实例对象Book book1 = (Book)constructor.newInstance();//3、输出看是否正常System.out.println(book1);//4、使用字节码对象来调用有参的构造函数对象Constructor<?> constructor1 = classObj.getConstructor(String.class);//注意:通过构造函数对象创建实例对象的时候,参数一定要进行对应匹配,否则会报非法参数异常!Book book2 = (Book)constructor1.newInstance("三国演义");System.out.println(book2);}private static void operateField(Class<?> classObj, Book book) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {//1、首先为Book对象中的公开属性进行一个赋值book.bid = 1001;//2、通过字节码对象来获取到该属性Field bidField = classObj.getField("bid");//3、通过对象来获取到刚刚通过字节码对象拿到的属性对象Integer bid = (Integer) bidField.get(book);//4、测试,是否能获取到book对象中的bid的属性值System.out.println(bid);//5、测试通过属性对象来更改属性值bidField.set(book, 1002);//6、测试,查看是否更改成功System.out.println(book.bid);//7、如果属性不是public修饰呢?//8、先把私有的属性值给进行一个赋值book.setBname("西游记");
// Field bnameField = classObj.getField("bname");//报错,找不到该属性的异常错误//9、通过专门获取非公有属性的方法来拿到具体的属性对象Field bnameField = classObj.getDeclaredField("bname");//10、设置私有的属性权限可见bnameField.setAccessible(true);//暴力破解私有特点//11、来拿到指定的Field对象在指定实例对象里面的值String bname = (String)bnameField.get(book);//12、测试是否能够正常的获取到类里的私有属性值System.out.println(bname);//13、只要你的属性是非公有的,你都需要通过getDeclaredField来获取book.price = 19.9;Field priceField = classObj.getDeclaredField("price");
// Field priceField = classObj.getField("price");
// priceField.setAccessible(true);//暴力破解私有特点double price = (double)priceField.get(book);System.out.println(price);//14、同时获取到所有的属性Field [] fields = classObj.getDeclaredFields();for(Field field:fields) {System.out.println(field.getName());}}
}
相关文章:
反射概率以及一些基本API的使用
请问,获取对象有几种方式? 1、通过构造函数来new一个对象; 2、通过clone来克隆一个对象; 3、通过序列化反序列化来构建一个对象; 4、通过反射来创建对象;a、通过Class类来创建;b、通过Const…...
DeepSeek API 调用 - Spring Boot 实现
DeepSeek API 调用 - Spring Boot 实现 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></depe…...
机器学习 - 理论和定理
在机器学习中,有一些非常有名的理论或定理,对理解机器学习的内在特性非常有帮助。本文列出机器学习中常用的理论和定理,并举出对应的举例子加以深化理解,有些理论比较抽象,我们可以先记录下来,慢慢啃&#…...
Java进阶:Docker
1. Docker概述 1.1. Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱…...
Winform禁止高分辨下缩放布局成功方法
Windows自动缩放布局会导致窗体上的按钮和文本挤在一起根本看不清楚。 那么该如何解决呢? 具体操作步骤如下: 1、在项目属性上切换到【安全性】菜单,勾选【启用ClickOnce安全设置】,然后立刻取消勾选; 为了生成app.…...
力扣142题——环形链表II
#题目# #代码# #链接# 这道链表题还是需要一些思维,这里把代码随想录的链接也贴在这里,有需要的小伙伴自行点击: https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%…...
工厂设计模式
工厂设计模式 简介 工厂模式是一种创建型设计模式,用于创建产品,代替手动new,主要包括简单工厂模式、工厂方法模式、抽象工厂模式。 一、简单工厂模式 定义:通过一个工厂类根据传入的参数匹配创建的产品 结构组成:…...
网络安全之探险
因为工作相关性,看着第三方公司出具的网络安全和shentou测试报告就想更深入研究一下,于是乎开始探索网络安全方面的知识,度娘、知乎开始一步步开始,总结昨天学到皮毛知识。 1.考证大全,开始是奔着这个目的去的 2.有用…...
Python基础语法精要
文章目录 一、Python的起源二、Python的用途三、Python的优缺点优点缺点 四、基础语法(1)常量和表达式(2)变量变量的语法(i)定义变量(ii)变量命名的规则 (3)变…...
C语言(枚举类型)
目录 1、什么是枚举 2、枚举成员的类型 3、枚举类型的实际应用 1、什么是枚举 枚举的定义就是:枚举(Enumeration)是一种用户自定义的数据类型,用于定义一组具有离散值的符号常量。 那通俗一点说就是把一些固定的值,一…...
讯方·智汇云校华为授权培训机构的介绍
官方授权 华为授权培训服务伙伴(Huawei Authorized Learning Partner,简称HALP)是获得华为授权,面向公众(主要为华为企业业务的伙伴/客户)提供与华为产品和技术相关的培训服务,培养华为产业链所…...
高级 Conda 使用:环境导出、共享与优化
1. 引言 在 Conda 的基础包管理功能中,我们了解了如何安装、更新和卸载包。但对于开发者来说,如何更好地管理环境、导出环境配置、共享环境,以及如何优化 Conda 的使用效率,才是提高工作效率的关键。本篇博客将进一步深入 Conda …...
从算法到落地:DeepSeek如何突破AI工具的同质化竞争困局
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
P9584 「MXOI Round 1」城市
题目描述 小 C 是 F 国的总统,尽管这个国家仅存在于网络游戏中,但他确实是这个国家的总统。 F 国由 n 个城市构成,这 n 个城市之间由 n−1 条双向道路互相连接。保证从任意一个城市出发,都能通过这 n−1 条双向道路,…...
CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发
CodeGPT IDEA DeepSeek,在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本,实测2022版IDEA无法获取到CodeGPT最新版插件。(在IDEA自带插件市场中搜不到,可以去官网搜索最新版本) ToolsVersionIntelliJ IDEA202…...
Filter过滤器
Filter:过滤器 概念: web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能 过滤器的作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符处理… 过滤器的生…...
git如何下载指定版本
要使用Git下载指定版本,可以通过以下步骤进行操作: 1. 使用Git命令行下载指定版本: 1.1 首先,使用git clone命令克隆整个git库到本地。例如:git clone [库的URL]。这将下载最新的代码到本地。 1.2 进入克隆…...
开源的 DeepSeek-R1「GitHub 热点速览」
春节假期回来,一睁眼全是王炸级的开源模型 DeepSeek-R1! GitHub 地址→github.com/deepseek-ai/DeepSeek-R1 DeepSeek-R1 开源还不到一个月,Star 数就飙升至冲破天际的 70k。虽然目前仅开源了模型权重,但同时发布的技术论文详细地…...
Open FPV VTX开源之OSD使用分类
Open FPV VTX开源之OSD使用分类 1. 源由2. 硬件2.1 【天空端】SigmaStar2.2 【天空端】Raspberry Pi2.3 【地面端】 3. 软件3.1 天空端软件3.2 地面端软件 4. 分类4.1 嵌入式OSD分类A1-嵌入式OSD:SigmaStar Android分类A2-嵌入式OSD:SigmaStar Hi3536分…...
请求超时处理
RequestMapping("/test") public DeferredResult<String> test() {DeferredResult<String> deferredResult new DeferredResult<>(6000L); // 设置超时时间为6秒// 模拟长时间任务new Thread(() -> {try {Thread.sleep(10000); // 模拟10秒的任…...
利用prompt技术结合大模型对目标B/S架构软件系统进行测试
利用prompt技术结合大模型对目标B/S架构软件系统进行测试,可参考以下步骤和方法: 测试需求理解与prompt设计 明确测试点:梳理B/S架构软件系统的功能需求、非功能需求(如性能、安全性、兼容性等),确定具体的测试点,如用户登录功能、数据查询功能、系统响应时间要求等。设…...
Go 语言里中的堆与栈
在 Go 语言里,堆和栈是内存管理的两个重要概念,它们在多个方面存在明显差异: 1. 内存分配与回收方式 栈 分配:Go 语言中,栈内存主要用于存储函数的局部变量和调用信息。当一个函数被调用时,Go 会自动为其…...
【人工智能】如何选择合适的大语言模型,是能否提高工作效率的关键!!!
DeepSeek R1入门指南 导读一、提示语差异1.1 指令侧重点不同1.2 语言风格差异1.3 知识运用引导不同 二、挑选原则2.1 模型选择2.2 提示语设计2.3 避免误区 结语 导读 大家好,很高兴又和大家见面啦!!! 在前面的内容中,…...
常见的IP地址分配方式有几种:深入剖析与适用场景
在数字互联的世界里,IP地址如同网络世界的“门牌号”,是设备间通信的基础。随着网络技术的飞速发展,IP地址的分配方式也日趋多样化,以适应不同规模、不同需求的网络环境。本文将深入探讨当前主流的几种IP地址分配方式,…...
无人机常见的开源飞控项目
开源飞控软件项目为无人机等无人载具的开发和应用提供了丰富的资源和灵活的解决方案,以下是一些常见的开源飞控软件项目: 1、PX4 简介:PX4 是一个高度模块化、可扩展的开源飞行控制平台,被广泛应用于各种类型的无人机࿰…...
模型报错infeasible,如何查看冲突约束
在使用Gurobi求解模型时,如果模型不可行(infeasible),可以通过以下步骤来查看冲突的约束或变量,帮助诊断问题: 1. 使用 computeIIS() 方法 Gurobi 提供了 computeIIS() 方法,用于计算不可行模…...
谭浩强C语言程序设计(5) 9章
1、统计三个候选人的票数 #include <cstdio> // 引入标准输入输出库 #include <cstring> // 引入字符串处理库,用于 strcmp 函数 #define N 10 // 定义一个宏常量 N,表示数组的最大长度// 定义一个结构体 Person,用于存储…...
Large Language Model Distilling Medication Recommendation Model
摘要:药物推荐是智能医疗系统的一个重要方面,因为它涉及根据患者的特定健康需求开具最合适的药物。不幸的是,目前使用的许多复杂模型往往忽视医疗数据的细微语义,而仅仅严重依赖于标识信息。此外,这些模型在处理首次就…...
STM32F407通过FSMC扩展外部SRAM和NAND FLASH
1 扩展外部SRAM 1.1 地址情况 FSMC控制器的存储区分为4个区(Bank),每个区256MB。其中,Bank1可以用于连接SRAM、NOR FLASH、PSRAM,还可以连接TFT LCD。Bank1的地址范围是0x60000000~0x6FFFFFFF。Bank1又分为4个子区,每…...
ArcGIS注册开发账号及API KEY
注册与激活 Sign up | ArcGIS Location Platform 填写信息,然后邮箱收到激活邮件,激活,再补充信息。 参考 Tutorial: Create an API key | Documentation | Esri Developer 产生API KEY Tutorial: Create an API key | Documentation |…...
C++-----------酒店客房管理系统
酒店客房管理系统 要求: 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订,系统会自动判断客房的可用情况; 4.入住管理:客户入住…...
AI 编程私有化部署,在使用 cline 时,可能无法避免私隐的泄漏问题
摘录:Cline Privacy Policy https://github.com/cline/cline/blob/main/docs/PRIVACY.md Key Points Cline operates entirely client-side as a VS Code extensionNo code or data is collected, stored, or transmitted to Clines servers 问题是:…...
DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解
DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解全集: 第一部分:Windows本地部署DeepSeek R1 第二部分:Macos本地部署DeepSeek R1 第三部分:Linux本地部署DeepSeek R1 第四部分:DeepSeek …...
2.14学习总结
#include <stdio.h> #include <stdlib.h> #include <math.h>#define MAX_N 32767// 二分查找最接近目标值的元素 int binarySearch(int* arr, int left, int right, int target) {while (left < right) {int mid left (right - left) / 2;if (arr[mid] …...
基于单片机的并联均流电源设计(论文+源码)
2.1 系统的功能及方案设计 两个电源,实现电流均衡效果。 在对系统进行功能设计过程中,主要框图如图2.1所示,系统的控制核心主要是由AT89S52单片机来进行控制,主要的核心控制模块由AT89S52单片机,两路由LM22673构成的DC/DC降压电路…...
Flask使用JWT认证
理解 JWT 认证🤫 嘿,朋友们!今天我们来聊一些在开发世界中非常酷的事情,那就是 Json Web Token,简称 JWT。这种小巧的规范使得在组织之间传递信息变得如此简单,就像把你的秘密记在一张纸上然后递给朋友一样…...
Reinforcement Learning Heats Up 强化学习持续升温
Reinforcement Learning Heats Up 强化学习持续升温 核心观点:强化学习正成为构建具有高级推理能力大语言模型(LLMs)的重要途径。 最新进展 模型示例:近期出现了如DeepSeek - R1及其变体(DeepSeek - R1 - Zero…...
一维差分算法篇:高效处理区间加减
那么在正式介绍我们的一维差分的原理前,我们先来看一下一维差分所应用的一个场景,那么假设我们现在有一个区间为[L,R]的一个数组,那么我要在这个数组中的某个子区间比如[i,m] (L<i<m<R)进行一个加k值或者减去k值的一个操作ÿ…...
解决 paddle ocr 遇到 CXXABI_1.3.13 not found 的问题
ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version CXXABI_1.3.13 not found (required by /home/hum/anaconda3/envs/ipc/lib/python3.11/site-packages/paddle/base/libpaddle.so) 通过命令检查 strings /lib/x86_64-linux-gnu/libstdc.so.6|grep CXXABI 而实际上我…...
DeepSeek助力:打造属于你的GPTs智能AI助手
文章目录 一、环境准备1.安装必要的工具和库2. 选择合适的开发语言 二、核心技术选型1. 选择适合的AI框架 三、功能实现1. 文本生成与对话交互2. 代码生成与自动补全3. 数据分析与报告生成 四、案例实战1. 搭建一个简单的聊天机器人2. 创建一个代码生成器 五、总结与展望1. 当前…...
用pytorch实现一个简单的图片预测类别
前言: 在阅读本文之前,你需要了解Python,Pytorch,神经网络的一些基础知识,比如什么是数据集,什么是张量,什么是神经网络,如何简单使用tensorboard,DataLoader。 本次模型训练使用的是…...
jemalloc 5.3.0的base模块的源码及调用链使用场景的详细分析
一、背景 这篇博客,我们继续之前的 由jemalloc 5.3.0初始化时的内存分配的分析引入jemalloc的三个关键概念及可借鉴的高性能编码技巧-CSDN博客 博客里对初始化分配逻辑进行分析,已经涉及到了jemalloc 5.3.0里的非常重要的base模块的一部分逻辑ÿ…...
Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案
本文是对 Redis 知识的补充,在了解了如何搭建多种类型的 Redis 集群,并清楚了 Redis 集群搭建的过程的原理和注意事项之后,就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言:虽然 Redis 是单线程的…...
DevOps工具链概述
1. DevOps工具链概述 1.1 DevOps工具链的定义 DevOps工具链是支持DevOps实践的一系列工具的集合,这些工具覆盖了软件开发的整个生命周期,包括需求管理、开发、测试、部署和运维等各个环节。它旨在通过工具的集成和自动化,打破开发与运维之间…...
开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~
Stable diffusion介绍: “StableDiffusion是一款创新的AI工具,将原始文本转化为精美图像。用户可调整图像的细节、风格、明暗等参数,创建个性化的高质量图像。这款高效的绘图工具便利了建筑、设计和插画等行业的专业人士,满足了他…...
LVS 负载均衡集群(DR 模式)
一、LVS-DR 模式核心原理 1.1. DR 模式工作原理 LVS-DR(Direct Routing)模式通过 数据链路层(MAC 层) 实现负载均衡,其核心特点是 请求流量经过 Director,响应流量由 Real Server 直接返回客户端…...
pnpm的使用
pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm ,意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…...
网页五子棋——通用模块
目录 项目创建 通用功能模块 错误码 自定义异常类 CommonResult jackson 加密工具 项目创建 使用 idea 创建 SpringBoot 项目,并引入相关依赖: 配置 MyBatis: 编辑 application.yml: spring:datasource: # 数据库连接配…...
FastAPI 高并发与性能优化
FastAPI 高并发与性能优化 目录 🚀 高并发应用设计原则🧑💻 异步 I/O 优化 Web 服务响应速度⏳ 在 FastAPI 中优化异步任务执行顺序🔒 高并发中的共享资源与线程安全问题 1. 🚀 高并发应用设计原则 在构建高并发应…...
阿里云IOT消息处理
文章主要讲述了阿里云IOT平台如何处理设备上报的消息、如何将消息路由到不同的处理逻辑、如何进行消息转发与转换等操作。 一、接收IOT消息 1.创建订阅 2.案列代码 官网案例代码:如何将AMQP JMS客户端接入物联网平台接收消息_物联网平台(IoT)-阿里云帮助中心 代码…...