【反射1】——Java基础(韩顺平讲解)

一个需求,引出反射 | 完整的反射使用流程:

在不修改源码的情况下,来控制程序,也符合设计模式中的opc原则(开闭原则:不修改源码,扩容功能)

1、创建配置文件:re.properties

classfullpath=com.reflection.Cat
method=hi

2、创建Cat类

package com.reflection;public class Cat {public String name = "招财猫";public void hi(){System.out.println("hi!"+ name);}public void cry(){System.out.println(name + "喵喵叫!");}
}

3、创建调用类:quection,并回顾传统调用的方法,以及反射机制解决的完整流程

package com.reflection;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class quection {public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {//问题:根据配置文件 re.properties 中的指定信息,创建Cat类 并 调用hi方法;//传统方法Cat cat = new Cat();cat.hi(); // 如果想调用cry方法,只能修改代码;System.out.println("===========================================");//反射//1. 使用Properties类 获取配置文件中的内容Properties properties = new Properties();properties.load(new FileInputStream("src\\main\\resources\\re.properties"));String classfullpath = properties.getProperty("classfullpath").toString();String method = properties.getProperty("method").toString();System.out.println("classfullpath:" + classfullpath);System.out.println("method:" + method);//2. 使用反射机制解决Class aClass = Class.forName(classfullpath); //加载类,返回Class类型的对象aClassObject o = aClass.newInstance(); //通过aClass得到 com.reflection.Cat 类的对象实例System.out.println("o的运行类型:" + o.getClass());//通过 aClass 得到 com.reflection.Cat 类的 methodName为“hi”的方法对象//即:在反射中,可把方法视为对象(万物接对象)Method method1 = aClass.getMethod(method);System.out.println("===========================================");//通过 方法对象 来实现 调用方法; 也就是 通过 method1对象 来调用 Cat类中的方法;method1.invoke(o);//传统方法:对象.方法();  反射:方法.invoke(对象);}
}

在 传统方法调用 和 反射机制 中,若改为调用Cat类中的cry方法:
传统方法需要修改代码,而反射机制只需要修改配置文件即可,将re.properties配置文件中的,method=hi 改为 method=cry

反射机制:

反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到。

加载完类后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射。

Java反射机制原理示意图:
在这里插入图片描述

Java反射机制可以完成:

1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象
3、在运行时得到任意一个类所具有的成员变量和方法
4、在运行时调用任意一个对象的成员变量和方法
5、生成动态代理

反射相关的主要类:这些类在java.lang.reflection包中

1、java.lang.Class:代表一个类,Class对象表示某个类加载后在堆中的对象
2、java.lang.reflect.Method:代表类的方法,Method对象表示某个类的方法
3、java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量
4、java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器

反射相关的主要类的代码应用:

package com.reflection;public class Cat {private String name = "招财猫";public int age = 0;public Cat() {}public Cat(String name) {this.name = name;}public void hi(){System.out.println("hi!"+ name);}public void cry(){System.out.println(name + "喵喵叫!");}
}
package com.reflection;import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;public class reflection01 {public static void main(String[] args) throws Exception {//反射//1. 使用Properties类 获取配置文件中的内容Properties properties = new Properties();properties.load(new FileInputStream("src\\main\\resources\\re.properties"));String classfullpath = properties.getProperty("classfullpath").toString();String method = properties.getProperty("method").toString();//2. 使用反射机制解决Class aClass = Class.forName(classfullpath); //加载类,返回Class类型的对象aClassObject o = aClass.newInstance(); //通过aClass得到 com.reflection.Cat 类的对象实例System.out.println("o的运行类型:" + o.getClass());//通过 aClass 得到 com.reflection.Cat 类的 methodName为“hi”的方法对象//即:在反射中,可把方法视为对象(万物接对象)Method method1 = aClass.getMethod(method);System.out.println("===========================================");//通过 方法对象 来实现 调用方法; 也就是 通过 method1对象 来调用 Cat类中的方法;method1.invoke(o);//传统方法:对象.方法();  反射:方法.invoke(对象);//java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量//得到name字段;//getField不能得到私有的属性Field name = aClass.getField("age");System.out.println(name.get(o));//传统写法:对象.成员变量   反射:成员变量对象.get(对象)//java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器Constructor constructor = aClass.getConstructor();//()中可以指定构造器参数类型,返回无参构造器System.out.println(constructor);//Cat()Constructor constructor1 = aClass.getConstructor(String.class);//这里传入的String.class 就是String类的Class对象System.out.println(constructor1);//Cat(String name)}
}

反射的优点和缺点:

优点: 可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。
缺点: 使用反射基本是解释执行,对执行速度有影响。

package com.reflection;import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;public class reflection02 {public static void main(String[] args) throws Exception {m1();m2();m3();}//传统方法调用hipublic static 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));}//反射机制调用方法hipublic static void m2() throws Exception {Class aClass = Class.forName("com.reflection.Cat"); //加载类,返回Class类型的对象aClassObject o = aClass.newInstance(); //通过aClass得到 com.reflection.Cat 类的对象实例Method method1 = aClass.getMethod("hi");//通过 aClass 得到 com.reflection.Cat 类的 methodName为“hi”的方法对象long start = System.currentTimeMillis();for (int i = 0; i < 900000000; i++) {method1.invoke(o);//反射调用方法}long end = System.currentTimeMillis();System.out.println("m2() 耗时:" + (end - start));}//反射机制优化调用方法hipublic static void m3() throws Exception {Class aClass = Class.forName("com.reflection.Cat"); //加载类,返回Class类型的对象aClassObject o = aClass.newInstance(); //通过aClass得到 com.reflection.Cat 类的对象实例Method method1 = aClass.getMethod("hi");//通过 aClass 得到 com.reflection.Cat 类的 methodName为“hi”的方法对象method1.setAccessible(true);long start = System.currentTimeMillis();for (int i = 0; i < 900000000; i++) {method1.invoke(o);//反射调用方法}long end = System.currentTimeMillis();System.out.println("m3() 耗时:" + (end - start));}
}=========执行结果============
m1() 耗时:4
m2() 耗时:1187
m3() 耗时:775

反射的简单优化——关闭访问检查:

1、Method 和 Field、Constructor对象都有setAccessible()方法
2、setAccessible作用是启动和禁用访问安全检查的开关
3、参数值为true表示,反射的对象在使用时取消访问检查,提高反射的效率。参数值为false,则表示反射的对象执行访问检查。
在这里插入图片描述

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

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

相关文章

SATA和M.2接口的异同点

SATA和M.2接口是连接存储设备的两种常见接口&#xff0c;它们在物理尺寸、传输速度、线缆和接头以及适用设备类型等方面有着显著的异同点。 物理尺寸 SATA接口通常用于2.5英寸硬盘、3.5英寸硬盘等传统机械硬盘以及SSD&#xff0c;而M.2接口则是一种较为新型的接口标准&#xff…

装饰 Web3 项目的用户交互界面(Web3项目二实战之四)

用户交互界面是Web3项目必不可少的,毕竟,Web3项目最终是面向用户的,所以,Web3项目总得需要一个优美的UI界面,已达到用户在视觉上精彩盛宴。 诚然,一个Web3项目若到了用户交互界面,大体上,这个Web3项目也将告一段落了。 没错,Web3第二个项目,也将终结于本篇,顺势拉开…

线下终端门店调研包含哪些内容

品牌渠道一般分为线上和线下&#xff0c;线上的价格、促销信息、店铺优惠机制等都可以通过登录查看&#xff0c;但是线下门店的数据则需要进店巡查&#xff0c;否则无法得到真实的店铺销售数据&#xff0c;当然也有品牌是靠线下的业务团队报备机制获得这些信息&#xff0c;但是…

前端常用的Vscode插件

前端常用的Vscode插件&#x1f516; 文章目录 前端常用的Vscode插件&#x1f516;1. Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code -- Vscode中文插件2. Code Runner -- 快速运⾏调试代码3. Live Server -- 实时重新加载本地开发服务器4. Image prev…

uni-app之HelloWorld实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

JAVA版的鸿鹄云商B2B2C:多商家入驻直播商城系统特性解析 商城免 费搭建

鸿鹄云商 b2b2c产品概述 【b2b2c平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级b2b2c电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

Swift 检测 iCloud状态

Show me the code: func isICloudContainerAvailable() -> Bool {if let _ FileManager.default.ubiquityIdentityToken {return true} else {return false} }推荐一下刚上线的 App 熊猫小账本&#xff0c;里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App&…

006.HCIA 路由

1、设备管理 用户视图 <xxxx> 系统视图 [xxxx] 接口视图 [xxxx-G] 协议视图 a. 视图切换 用户视图 -> 系统视图 系统视图 -> 接口视图 当前视图 -> 上一层视图 当前视图 -> 用户视图 system-view interface g0/0/0 quit Ctrl Z b. 系统视图命令…

人工智能:预测房价模型的构建与应用

摘要&#xff1a; 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是一种模拟人类智能思维的技术。“预测房价”是AI在房地产领域的重要应用之一。本文将介绍如何使用Python构建一个预测房价的人工智能模型&#xff0c;并对其进行说明和应用。 引言 人…

JavaOOP篇----第十六篇

系列文章目录 文章目录 系列文章目录前言一、a=a+b与a+=b有什么区别吗?二、final、finalize()、finally三、JDBC操作的步骤四、在使用jdbc的时候,如何防止出现sql注入的问题。前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

tinymce自定义工具栏

tinymce自定义工具栏 话不多说直接上代码&#xff0c;此处添加 imgs 的工具为例 initTinymce() {const _this thisreturn {language_url: https://cdn.jsdelivr.net/npm/tinymce-i18n20.12.25/langs5/zh_CN.js,language: zh_CN,body_class: panel-body ,object_resizing: fal…

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学&#xff0c;有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解&#xff0c;那对strlen又了解多少。其实这个问题应该让不少人困扰。…

openmediavault基本操作

omv基本操作 使用hostname访问共享文件夹设置1.挂载磁盘2.提交更改3.新建用户4.建立共享文件夹5.设置SMB/CIFS服务7.测试7.1.速度测试 使用hostname访问 把网口和wifi设置成DHCP,使用hostname访问,这样把NAS拿到任何地方都不需要配置了,自动联网进行访问. #网络->常规 #设…

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系

本文为学习所用&#xff0c;严禁转载。 本文参考链接 https://zhuanlan.zhihu.com/p/667382398 QPSK代码及高斯白噪声如何产生 https://ww2.mathworks.cn/help/signal/ref/butter.html 滤波器 https://www.python100.com/html/4LEF79KQK398.html 低通滤波器 本实验使用matlab仿…

静态HTTP的优势:速度、安全性和可扩展性,一个都不能少!

大家好&#xff0c;今天我们来聊聊静态HTTP的优势。有人可能会说&#xff1a;“静态HTTP&#xff0c;不就是那些不会动的网页吗&#xff1f;”错&#xff01;静态HTTP可不仅仅是静止不动的&#xff0c;它可是让网站速度飞快、安全稳定、扩展性强的神器&#xff01;不信&#xf…

鸿蒙插槽?全局插槽和局部插槽?数据不更新?

Builder的基本语法数据是不会响应式的 第一种&#xff1a; 全局插槽&#xff1a;传入的变量是state数据&#xff08;数据是对象也一样&#xff09;&#xff0c;但是button点击更改&#xff0c;并没有任何反应。规则就是不更新 Entry Component struct Demo02 {State message:…

TomcatHttp协议

1 javaWEB 1.1 Web概述 Web在英文中的含义是网状物&#xff0c;网络。在计算机领域&#xff0c;它通常指的是后者&#xff0c;即网络。像我们前面接触的WWW&#xff0c;它是由3个单词组成的&#xff0c;即&#xff1a;World Wide Web&#xff0c;中文含义是万维网。而我们前…

如何深入理解Java的多态?

在Java中&#xff0c;多态&#xff08;polymorphism&#xff09;是面向对象编程的一个重要概念&#xff0c;它允许你使用一个通用的接口来表示不同的对象和操作这些对象&#xff0c;而不必关心具体的对象类型。多态性有两种主要形式&#xff1a;编译时多态&#xff08;静态多态…

C语言使用qsort和bsearch实现二分查找

引言 在计算机科学领域&#xff0c;查找是一项基本操作&#xff0c;而二分查找是一种高效的查找算法。本博客将详细解释一个简单的C语言程序&#xff0c;演示如何使用标准库函数qsort和bsearch来对一个整数数组进行排序和二分查找。 代码解析 包含头文件 #include <stdi…

数据分析思维

Why&What 数据分析是为了驱动决策赋能业务。在数据分析过程中需要对目标进行拆解量化&#xff0c;如何拆解量化目标便是数据分析思维。 在任务拆解过程中使用的软件、统计模型、分析方法等为分析工具和手段&#xff0c;如何在恰当的场景合理的使用这些工具、模型、方法、手…