反射概率以及一些基本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());}}
}

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

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

相关文章

从零搭建:Canal实时数据管道打通MySQL与Elasticsearch

Canal实时同步Mysql Binlog至 Elasticsearch 文章目录 Canal实时同步Mysql **Binlog**至**Elasticsearch** 一. 环境准备1.环境检查检查Mysql是否开启BinLog开启Mysql BinlogJava环境检查 2.新建测试库和表3.新建Es索引 二.**部署 Canal Server****2.1 解压安装包****2.2 配置 …

五、k8s:容忍 存储卷

容忍&#xff1a; 即使节点上有污点&#xff0c;依然可以部署pod。 tolerations: operator: "Exists" 不指定key&#xff0c;表示容忍所有的污点 cordon和drain cordon: 直接标记节点为不可用&#xff0c;pod不能部署到该节点。新建的pod不会再部署到该节点&#…

Springboot_实战

项目开发 lombok使用 自动为实体类提供get、set、toString方法 引入依赖 实体类上添加注解 统一响应结果 注意要写get、set方法&#xff1b;下面是错误的&#xff0c;因此要加上Data注解 一个注册的接口的示例 Controller层 Service层 Mapper层 参数校验 但是同样存在一…

稀土抑烟剂——为纺织品安全加持,保护您的每一寸触感

一、稀土抑烟剂的基本概念 稀土抑烟剂是基于稀土元素&#xff08;如稀土氧化物和稀土金属化合物&#xff09;研发的一类新型阻燃材料。它能够有效提高纺织品的阻燃性&#xff0c;抑制火灾发生时产生的烟雾和有害气体&#xff0c;减少火灾对人体的危害。稀土抑烟剂具有更强的稳…

本地部署SafeLine详细指南:抵御网络攻击构建更安全的网站环境

文章目录 前言1.关于SafeLine2.安装Docker3.本地部署SafeLine4.使用SafeLine5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址前言 各位建站小能手们,无论是想搭建个人博客、企业官网还是各种应用平台来推广自己的内容或产品,在这个数字时代都已经…

Chrome 浏览器可以读写本地文件了,虽说是实验api,但是基本86+已经支持了

目前该API只能在https域名上使用&#xff01;&#xff01;&#xff01; 实现逻辑&#xff1a; 1.唤醒浏览器选择文件夹、文件权限 document.getElementById(button).addEventListener(click, async () > {getFile()});async function getFile () {// 打开文件选择器 记…

华宇TAS应用中间件与因朵科技多款产品完成兼容互认证

在数字化浪潮澎湃向前的当下&#xff0c;信息技术的深度融合与协同发展成为推动各行业创新变革的关键力量。近日&#xff0c;华宇TAS应用中间件携手河北因朵科技有限公司&#xff0c;完成了多项核心产品的兼容互认证。 此次兼容性测试的良好表现&#xff0c;为双方的进一步深入…

数字IC秋招知识点—1

数字IC秋招准备知识点—1 时序逻辑与组合逻辑 1. 定义与核心原理 组合逻辑&#xff1a; 输入决定输出&#xff1a;当前的输出仅由输入决定&#xff0c;无记忆功能。无反馈回路示例&#xff1a;基本逻辑单元&#xff0c;加法器&#xff0c;多路选择器MUX&#xff0c;译码器&am…

【webview Android】视频获取首帧为封面

文章目录 需求分析获得首帧其他方法 需求分析 客户端中h5上传视频&#xff0c;视频封面默认首帧。 遇到问题&#xff1a;原生的video现象如下 IOS会在加载好后显示首帧&#xff08;没加载好显示黑屏&#xff0c;符合预期&#xff09;Android加载好后默认封面为一个奇怪的占位…

大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展

Title 题目 Brain networks and intelligence: A graph neural network based approach toresting state fMRI data 大脑网络与智力&#xff1a;基于图神经网络的静息态fMRI数据分析方法 01 文献速递介绍 智力是一个复杂的构念&#xff0c;包含了多种认知过程。研究人员通…

DeepSeek如何重塑我的编程学习:计算机新生的AI实践

目录 &#x1f680;前言&#x1f31f;邂逅DeepSeek&#xff1a;从困惑到惊喜&#x1f4af;初学编程的困境&#x1f4af;DeepSeek的优势 &#x1f58a;️DeepSeek在编程学习中的运用&#x1f4af;注释&#x1f4af;算法逐步分析&#x1f4af;调试帮助&#x1f4af;跨语言迁移学习…

信息收集-Web应用JS架构URL提取数据匹配Fuzz接口WebPack分析自动化

知识点&#xff1a; 1、信息收集-Web应用-JS提取分析-人工&插件&项目 2、信息收集-Web应用-JS提取分析-URL&配置&逻辑 FUZZ测试 ffuf https://github.com/ffuf/ffuf 匹配插件 Hae https://github.com/gh0stkey/HaE JS提取 JSFinder https://github.com/Threez…

安科瑞光储充一体化微电网系统的设计与优化研究-安科瑞 蒋静

摘要&#xff1a;双碳能源技术是一种绿色、可持续的能源发展方向&#xff0c;光储充一体系统作为其中的重要组成部分&#xff0c;具有将光能转化为电能并进行储存和供电的功能。文章对光储充一体系统的设计与性能进行分析&#xff0c;以期为双碳能源技术的推广和应用提供技术支…

【BUG】Ubuntu|有nvcc,没有nvidia-smi指令,找不到nvidia-driver安装包

很奇怪&#xff0c;本来能使用的&#xff0c;放个假回来就用不了了。 排查了以下所有步骤最终解决。 我的Ubuntu版本&#xff1a;Ubuntu22 nvcc -v&#xff1a;有。如果没有的话你需要安装“sudo apt-get install nvidia-cuda-toolkit”&#xff0c;其他问题请去别的博客查。…

spring-ai快速集成deepseek大模型

一、Spring AI简介&#xff1a;Spring AI致力于简化AI项目的开发与部署流程&#xff0c;使Java开发者能够更高效地将AI技术集成到业务系统中。它提供了开箱即用的工具和接口&#xff0c;方便集成和管理各种AI模型。 目前,Spring AI 支持的 AI 平台包括&#xff1a;OpenAI (Chat…

进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板输出占空比和频率)

定义变量 uint16_t PA6_frq,PA7_frq; uint16_t PA6_duty10,PA7_duty20; 开启定时器PWM HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1); 给变量赋值 PA6_frq80000000/8000/TIM16->ARR1;PA7_frq80000000/4000/TIM17->AR…

TCNE 网络安全

一.概况 CTF&#xff08;Capture The Flag&#xff09;在网络安全领域中指的是网络技术人员之间进行技术竞技的一种比赛形式&#xff0c;它起源于1996年的DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式&#xff0c;现已成为全球范围网…

信呼OA办公系统sql注入漏洞分析

漏洞描述 信呼OA办公系统uploadAction存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息。 环境搭建 源码下载地址&#xff1a;https://github.com/rainrocka/xinhu 下载后解压到本地网站根目录下&#xff0c;配置好数据库&#xff0c;然后安装即可 默认密…

springboot如何将lib和jar分离

遇到一个问题&#xff0c;就是每次maven package或者maven install后target中的jar很大&#xff0c;少的50几MB&#xff0c;大的100多兆 优化前&#xff1a; 优化后&#xff1a; 优化前 优化后压缩率77.2MB4.65MB93% 具体方案&#xff1a; pom.xml中 <build><…

ThreadLocal源码分析

文章目录 1.核心数据结构 ThreadLocalMap1.静态内部类 Entry2.真正存储数据的是table数组 2.ThreadLocal.set()方法源码详解1.set2.getMap3.ThreadLocalMap.set4.createMap5.rehash6.resize 3.ThreadLocalMap.get()详解1.get2.ThreadLocalMap.getEntry3.getEntryAfterMiss 4.Th…