Java之反射机制

news2024/12/24 2:19:34

反射机制

引出反射

在这里插入图片描述
我们的猫类
在这里插入图片描述

传统的方式
就是new 然后通过对象调用呗
在这里插入图片描述
用properties做的话,首先肯定是获取信息
读取配置文件的信息
在这里插入图片描述
然后我们需要创建对象是吧
但是这个时候
new classfullpath是不行的,因为我们实际上需要的是
类名
而不是字符串,不能用字符串来代替类名
所以你从配置文件读取的信息,不能用来创建类
那该怎么办呢?
这就该用到反射了

反射快速入门

在这里插入图片描述
这样的意义就是通过外部文件配置在不修改源码来控制程序
是我们学习后面Spring全家桶,Mybaits等框架的灵魂

比如你的猫类里面多一个cry方法
你想调用cry不想调用hi就只能修改源码,把cat.hi改为cat.cry
而反射的话
在这里插入图片描述
只需要把method=hi改为method=cry就可以了,修改的是配置文件不是源代码

反射原理图

在这里插入图片描述
就是本质是通过Class类对象来操作对象
而反射就是
不通过new什么的
直接通过Class类来操作

而且对应的Class类存储的都是对象
可以把方法当做对象,构造器也可以当做对象,变量也是对象
每个对象存储在对应的对象数组里

反射机制中主要类

在这里插入图片描述
演示的话
在Cat类多加一个public属性age=10
在加一个构造器
在这里插入图片描述
变量获取
在这里插入图片描述

获取无参构造
在这里插入图片描述
获取有参构造
在这里插入图片描述

可以通过对应的

成员变量对象.get(对象)来获取对应的值
这个对象是我们cat的实例对象

方法上面也有例子
方法对象.invoke(对象)
关于方法为什么也要区别化,因为每个对象的属性值可能不一样,方法可能调用属性值,所以对应的方法也可能不一样,具体表现就是每个对象的方法对象不同

还有那个构造器
构造器对应的方法之后讲
无参和有参构造器
有参构造的话,他的参数不是什么String而是String.class就是String类的Class对象

代码

package yuan.hsp.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

import org.junit.jupiter.api.MethodOrderer.MethodName;
@SuppressWarnings({"all"})
//反射机制的简单介绍
public class introduce {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, 
	IllegalAccessException, NoSuchMethodException, SecurityException, 
	IllegalArgumentException, InvocationTargetException, NoSuchFieldException {//这异常有点多,你忍一下
//	1.正常想调用对应的方法
//	Cat cat = new Cat();
//	cat.hi();
//	2.使用properties类,通过配置文件来进行对应方法的调用,先读取配置文件
		Properties properties = new Properties();
//		properties.load(new FileInputStream("d:\\eclipseworkspace\\Learn\\src\\re.properties"));
		properties.load(new FileInputStream("src\\re.properties"));
		String classfullpath = properties.get("classfullpath").toString();
		String Method = properties.get("method").toString();
		System.out.println(classfullpath);
		System.out.println(Method);
		
//		3.反射机制运用
		//1.加载类,返回Class对象cls
		Class cls = Class.forName(classfullpath);
		//2.通过cls创建对象实例
		Object newInstance = cls.newInstance();
		System.out.println(newInstance.getClass());
		//3.通过对cls来获取到我们对应的对象方法,在反射中万物皆是对象
		Method method1 = cls.getMethod(Method);
		//4.通过method1调用方法,调用格式:方法对象.invoke(实例对象)
		System.out.println("==============================");
		method1.invoke(newInstance);
		//好处就是可以通过该配置文件来改变调用方法,不用修改源代码
		
//		一些常用类的方法
		//java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量
		//得到age字段吧,因为private的name是无法用getField获取
		Field field = cls.getField("age");
		System.out.println(field.get(newInstance));//成员变量对象.get(实例对象)
		
		Constructor constructor = cls.getConstructor();
		System.out.println(constructor);
		
		Constructor constructor2 = cls.getConstructor(String.class);
		System.out.println(constructor2);
		
		
	}
}

反射优化

在这里插入图片描述

案列演示

package yuan.hsp.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@SuppressWarnings({"all"})
//演示类罢了
//还有一个时间对比来进行反射的优化
public class Cat {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, 
	IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, 
	InvocationTargetException {
		Cat cat = new Cat();
		cat.m1();
		cat.m2();
		cat.m3();
		
	}
	
	//这里为了方便我们观察,把hi()输出的内容注释
	//m1是普通的对象调用方法
	//m2就是用反射机制调用方法,取消访问调查
	//m3没有调用setAccessible(true),没有取消访问调查
	//可以发现效率差距很大,怎么进行优化呢?
	public void m1() {
		Cat cat = new Cat();
		long start = System.currentTimeMillis();
		for(int i =0;i<900000000;i++) {
			cat.hi();
		}
		long end = System.currentTimeMillis();
		System.out.println("m1耗时"+(end-start));
	}
	public void m2() throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
	NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		Class cls = Class.forName("yuan.hsp.reflection.Cat");
		Object cat = cls.newInstance();
		Method method = cls.getMethod("hi");
		method.setAccessible(true);//取消访问检查,提高效率
		
		
		
		long start = System.currentTimeMillis();
		for(int i =0;i<900000000;i++) {
			method.invoke(cat);
		}
		long end = System.currentTimeMillis();
		System.out.println("m2=耗时"+(end-start));
		
	}
	public void m3() throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
	NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		Class cls = Class.forName("yuan.hsp.reflection.Cat");
		Object cat = cls.newInstance();
		Method method = cls.getMethod("hi");
			
		long start = System.currentTimeMillis();
		for(int i =0;i<900000000;i++) {
			method.invoke(cat);
		}
		long end = System.currentTimeMillis();
		System.out.println("m3=耗时"+(end-start));
		
	}
	
	private String name="招财猫";
	public int age =10;
	

	public Cat() {
		super();
	}
	public Cat(String name) {
		super();
		this.name = name;
	}
	public void hi() {
//		System.out.println("hi"+name);
	}
	public void cry() {
		System.out.println(name+"喵喵叫...");
	}
}

在这里插入图片描述

优化方法

在这里插入图片描述

可以通过设置为true来跳过访问调查这个步骤提高效率
就是我们之前代码的m2()和m3()对比
多出来那一行代码

method.setAccessible(true);//取消访问检查,提高效率

可以一定程度上提高效率,但是肯定不如传统方式来的快

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年1月7日:fastadmin导出数据为excel格式

需求图&#xff1a; 实现方法&#xff1a; 第一种方法&#xff1a;fastadmin自带导出数据&#xff0c;直接点击下载即可 效果图第二种方法&#xff1a;自定义导出按钮&#xff0c;需要编写方法 效果图&#xff1a; 效果图代码实现 首先&#xff1a;前端按钮代码(可直接拿来用…

【HCIA-openEuler】实验手册—01【openEuler操作系统安装】

文章目录一、实验介绍1、关于本实验2、实验目的3、实验所需材料二、配置虚拟化环境步骤1&#xff1a;硬件准备步骤2&#xff1a;软件准备三、安装openEuler操作系统1、创建虚拟机步骤1&#xff1a;新建虚拟机步骤2&#xff1a;向导选择典型(推荐)步骤3&#xff1a;选择镜像文件…

MonoScene: Monocular 3D Semantic Scene Completion

Paper name MonoScene: Monocular 3D Semantic Scene Completion Paper Reading Note URL: https://arxiv.org/pdf/2112.00726.pdf TL;DR 2022 cvpr 论文&#xff0c;提出一种能在室内与室外场景均可使用的单目 SSC 方案&#xff0c;与特斯拉的 Occupancy Network 非常相似…

【Java基础】day12

一、Redis 的缓存穿透、缓存击穿、缓存雪崩是什么&#xff1f; 缓存穿透 请求不存在【 DB 和 Redis 中都不存在】的数据&#xff0c;导致请求直接打到持久层数据库中&#xff0c;导致数据库负载过高&#xff0c;甚至导致宕机。这样的请求几乎可以导致请求次次到达 DB &#xff…

Cesium中tif转经纬度投影或墨卡托地图瓦片 CesiumLab系列教程

Cesium 目前支持的影像切片规范有两种形式的&#xff1a; 1.经纬度直拉切片方式 &#xff08;GeographicTilingScheme &#xff09;&#xff0c; 2.web 墨卡托切片方式 &#xff08;WebMercatorTilingScheme&#xff09;。 根据常规传统&#xff0c;瓦片大小都是 256&#x…

数字验证学习笔记——SystemVerilog芯片验证22 ——功能覆盖率策略覆盖组

一、功能覆盖率策略 1.1 收集信息而非数据 对于一些设计&#xff0c;你需要关心的是合法的寄存器地址和非法的寄存器地址&#xff0c;可写的寄存器域和非法的寄存器域&#xff0c;而不是具体的寄存器地址数值。一旦关注的地方着眼于感兴趣的状态&#xff0c;而不是具体数值&a…

2022年中职网络安全竞赛SSH弱口令渗透测试解析(详细)

B-7 SSH弱口令渗透测试 任务环境说明: 服务器场景:Server18(关闭链接)服务器场景操作系统:Linux(版本不详)在本地PC渗透测试平台Kali中使用zenmap工具扫描服务器场景Server18-2所在网段(例如:172.16.101.0/24)范围内存活的主机IP地址和指定开放的21、22、23端口。并将…

【NI Multisim 14.0原理图环境设置——标题栏】

目录 序言 一、标题栏 &#x1f34d;1.添加标题块 &#x1f34d; 2.修改标题块 &#xff08;1&#xff09;直接修改 &#xff08;2&#xff09;标题块编辑器 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表…

【C++】命名空间 以及 如何理解using namespace std;

目录 命名空间 1.由来 2.概念 3.使用 方法一 方法二 方法三 4.嵌套使用 命名空间 很多人在学习C的时候&#xff0c;第一个代码想必是如下样子的。和C语言相比&#xff0c;库函数换了&#xff0c;同时多了一个 using namespace std&#xff1b; 但是&#xff0c;你真的了…

Allegro174版本新功能介绍之高阶Contour模式使用

Allegro174版本新功能介绍之高阶Contour模式使用 在Allegro低版本166以及172版本中,有Contour命令,但是只有沿着routekeepin和Connect Line功能,如下图 当升级到了174版本的时候,Allegro支持沿着任意目标走线,甚至是过孔和铜皮,如下图 具体操作介绍如下 以沿着这块铜皮轮…

一元三次方程求解 -- 二分查找

[NOIP2001 提高组] 一元三次方题目描述思路codetag&#xff1a;数学&#xff0c;二分查找 题目链接&#xff1a;洛谷P1024: [NOIP2001 提高组] 一元三次方 题目描述 思路 先对三次函数求导得到二次函数 3ax22bxc03ax^2 2bx c 03ax22bxc0 然后利用求根公式计算出两个极值点 …

Vue--》Vue3自定义组件以及新组件的使用讲解

目录 customRef Vue3提供的新组件 Fragment Teleport Suspense Vue3中全局API的改变 customRef 创建一个自定义的ref&#xff0c;并对其依赖项跟踪和更新触发进行显示控制。 <template><input type"text" v-model"keyword"><h3>…

谷粒学苑项目-第一章公共模块下的Swagger配置类-1.4

一、在common子模块下创建Swagger配置类 1. guli_parent->common子模块->service_base子模块->SwaggerConfig配置类 common子模块是pom类型 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId>…

【Java寒假打卡】Java基础-集合Collection

【Java寒假打卡】Java基础-集合Collection集合与数组之间的区别集合体系结构Collection常用的方法集合-迭代器迭代器原理分析迭代器删除方法的注意事项增强for循环集合与数组之间的区别 数组的长度是不可变的&#xff0c;集合的长度是可变的数组可以存基本数据类型和引用数据类…

Xilinx AXI4 协议

AXI4 相对复杂&#xff0c;但 SOC 开发者必须掌握。AXI 协议的具体内容可参考 Xilinx UG761 AXI Reference Guide。在这里我们简单了解一下。 AXI4 所采用的是一种 READY&#xff0c;VALID 握手通信机制&#xff0c;即主从模块进行数据通信前&#xff0c;先根据操作对各所用到的…

填满背包方案数OJ

目录 LintCode 炼码物品大小不重复的填满背包的方案数 LintCode 炼码 物品大小存在重复情况 LintCode 炼码不重复的组合个数 完全背包_牛客题霸_牛客网 LintCode 炼码物品大小不重复的填满背包的方案数 描述给出 n 个物品, 以及一个数组, nums[i]代表第i个物品的大小, 保证大…

编辑PDF文件的两种方法

PDF文件具备较好的稳定性、兼容性&#xff0c;在日常工作中的应用非常广泛&#xff0c;但想要编辑文件内容就不那么容易了&#xff0c;下面来说说编辑PDF文件的两种方法。 方法一&#xff1a; 我们知道&#xff0c;查看PDF文件只需要阅读器就可以了&#xff0c;如果想对文件内…

springboot 整合 webservice服务

目录webservice百科创建一个springboot项目并导入相关依赖编写webservice接口编写实现类发布webservice浏览器访问postman调用在前一段时间用到了webservice服务&#xff0c;今天整理了一下&#xff0c;记录下来。webservice百科 Web Service是一个平台独立的&#xff0c;低耦…

Apifox调用Security权限接口

Apifox调用Security权限接口1. SpringBoot3.0集成SpringSecurity1.1 pom1.2 properties配置2. Apifox 配置2.1 配置根目录Auth2.2 ApiFox 分享调用本地接口本教程环境&#xff1a; Apifox&#xff1a;2.2.14 &#xff08;建议更新到最新版本&#xff0c;老版本Auth从父级继承可…

flowable数据表详解

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.flowable2.数据表的命名规则3.ACT_RU_*4.ACT_ID_*5.ACT_HI_*数据表的介绍参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hard…