学习JavaEE的日子 Day40 反射案例

Day40

1.反射案例 之 万能数组扩容

public class Test01 {public static void main(String[] args) {String[] ss = {"小希","小空","小丽","小光","小爱"};String[] newSS = MyArrays.copyOf(ss, 8);System.out.println(MyArrays.toString(newSS));int[] is = {1,2,3,4,5};int[] newIS = MyArrays.copyOf(is, 8);System.out.println(MyArrays.toString(newIS));}
}

MyArrays类

public class MyArrays {/*** 拷贝数组(以前的方法)* @param original 目标数组* @param newLength 新数组的长度* @return 新数组*/public static int[] copyOf(int[] original, int newLength){int copyLength = original.length;if(copyLength > newLength){copyLength = newLength;}int[] newArr = new int[newLength];for (int i = 0; i < copyLength; i++) {newArr[i] = original[i];}return newArr;}/*** 反射的方法* 引用数据类型数组的扩容(不支持基本数据类型)* @param original* @param newLength* @return*/public static <T> T[] copyOf(T[] original , int newLength){int copyLength = original.length;if(copyLength > newLength){copyLength = newLength;}//获取元素的类型Class<? extends Object[]> clazz = original.getClass();//String[].classClass<?> componentType = clazz.getComponentType();//String.clss//利用反射创建数组@SuppressWarnings("unchecked")T[] ts = (T[]) Array.newInstance(componentType, newLength);//遍历源数组,将数据复制到新数组中for (int i = 0; i < copyLength; i++) {//获取源数组的数据Object element = Array.get(original, i);//赋值给新数组Array.set(ts, i, element);}return ts;}/*** 将数组转换为字符串* @param a 目标数组* @return 转换后的字符串*/public static String toString(int[] is) { StringBuffer sb = new StringBuffer();sb.append("[");for (int element : is) {if(sb.length() != 1){sb.append(",");}sb.append(element);}sb.append("]");return sb.toString();}/*** 将数组转换为字符串* @param a 目标数组* @return 转换后的字符串*/public static <T> String toString(T[] a){StringBuffer sb = new StringBuffer();sb.append("[");for (int i = 0; i < Array.getLength(a); i++) {if(sb.length() != 1){sb.append(",");}Object element = Array.get(a, i);sb.append(element);}sb.append("]");return sb.toString();}}

2.反射案例 之 业务与逻辑分离 的思想

invoke方法参数的意义

参数一:表示代理对象,一般不用(了解)

参数二:就是方法名,我们可以对方法名进行判断,是增强还是拦截

参数三:调用方法时,传递的参数

需求:用户选择获取数据的方式(本地数据、网络数据)

public class Test01 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);showMenu();int num = scan.nextInt();DataSource dataSource = getDataSourceObject(num);dataSource.getDataSource();scan.close();}public static void showMenu(){System.out.println("请选择获取数据的方式:");ArrayList<String> menulist = DataCenter.menuList;for (String element : menulist) {System.out.println(element);}}public static DataSource getDataSourceObject(int num){DataSource dataSource = DataCenter.dataSourceList.get(num-1);return dataSource;}
}

配置文件

dataSourceConfig.properties

data=com.qf.reflex02.LocalDataSource,com.qf.reflex02.NetworkDataSource,com.qf.reflex02.OtherDataSource

menuConfig.properties

data=1-\u83B7\u53D6\u672C\u5730\u6570\u636E,2-\u83B7\u53D6\u7F51\u7EDC\u6570\u636E,3-\u83B7\u53D6\u5176\u4ED6\u6570\u636E
public abstract class DataSource {public abstract void getDataSource();}

数据中心类(选择1,2,3,继续第几个操作)

//数据中心
public class DataCenter {public static final ArrayList<String> menuList;public static final ArrayList<DataSource> dataSourceList;//初始化菜单数据static{menuList = new ArrayList<>();Properties p = new Properties();try {p.load(DataCenter.class.getClassLoader().getResourceAsStream("menuConfig.properties"));} catch (IOException e) {e.printStackTrace();}String data = p.getProperty("data");String[] split = data.split(",");Collections.addAll(menuList, split);}//初始化数据源数据static{dataSourceList = new ArrayList<>();Properties p = new Properties();try {p.load(DataCenter.class.getClassLoader().getResourceAsStream("dataSourceConfig.properties"));} catch (IOException e) {e.printStackTrace();}String data = p.getProperty("data");String[] split = data.split(",");for (String classPath : split) {try {Class<?> clazz = Class.forName(classPath);DataSource dataSouce = (DataSource) clazz.newInstance();dataSourceList.add(dataSouce);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}		}}
}

获取本地资源的类(第一个选择)

//获取本地资源的类
public class LocalDataSource extends DataSource{private Scanner scan;public LocalDataSource() {scan = new Scanner(System.in);}@Overridepublic void getDataSource() {System.out.println("请填写需要拷贝文件的路径:");String path = scan.next();File file = new File(path);BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream(path));bos = new BufferedOutputStream(new FileOutputStream(file.getName()));byte[] bs = new byte[1024];int len;while((len=bis.read(bs)) != -1){bos.write(bs, 0, len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(bis != null){try {bis.close();} catch (IOException e) {e.printStackTrace();}}if(bos != null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}}}}

获取网络资源的类(第二个选择)

//获取网络资源的类
public class NetworkDataSource extends DataSource{private Scanner scan;public NetworkDataSource() {scan = new Scanner(System.in);}@Overridepublic void getDataSource() {//https://wx2.sinaimg.cn/mw690/e2438f6cly1hoo3qpm7vrj21111jk4mn.jpgSystem.out.println("请填写下载图片的网址:");String path = scan.next();try {//创建链接对象URL url = new URL(path);//获取连接对象HttpURLConnection connection = (HttpURLConnection) url.openConnection();//设置参数connection.setConnectTimeout(5000);//设置连接超时时间connection.setReadTimeout(5000);//设置读取数据超时时间connection.setDoInput(true);//设置是否允许使用输入流connection.setDoOutput(true);//设置是否允许使用输出流//获取响应状态码int code = connection.getResponseCode();if(code == HttpURLConnection.HTTP_OK){//文件名String fileName = path.substring(path.lastIndexOf("/")+1);BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));byte[] bs = new byte[1024];int len;while((len = bis.read(bs)) != -1){bos.write(bs, 0, len);}bis.close();bos.close();}else if(code == HttpURLConnection.HTTP_NOT_FOUND){System.out.println("页面未找到");}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

其他数据(第三个选择)

//其他数据
public class OtherDataSource extends DataSource{@Overridepublic void getDataSource() {System.out.println("获取其他数据");}}

3.反射案例 之 操作注解

利用注解使Student类的属性与数据库表名一致,与mybatis的起别名差不多

public class Test01 {public static void main(String[] args) {Student stu = new Student("小威", "男", 18);String sql = DBUtil.generateInsertSQL(stu);System.out.println(sql);//INSERT INTO s_student(s_name,s_sex,s_age) VALUES('小威','男',18);}
}

类名注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TableInfo {String name();
}

属性注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldInfo {String name();String type();
}

Student类

@TableInfo(name="s_student")
public class Student {@FieldInfo(name="s_name",type="varchar")private String name;@FieldInfo(name="s_sex",type="varchar")private String sex;@FieldInfo(name="s_age",type="int")private int age;//有参构造,无参构造,get,set方法省略
}

数据库SQL拼接:INSERT INTO s_student(s_name,s_sex,s_age) VALUES(‘小威’,‘男’,18);

public class DBUtil {public static String generateInsertSQL(Object obj){Class<? extends Object> clazz = obj.getClass();//获取表名TableInfo tableInfo = clazz.getAnnotation(TableInfo.class);if(tableInfo == null){throw new RuntimeException();}String tableName = tableInfo.name();StringBuffer names = new StringBuffer();StringBuffer values = new StringBuffer();//获取属性数据Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);FieldInfo fieldInfo = field.getAnnotation(FieldInfo.class);String name = fieldInfo.name();String type = fieldInfo.type();if(names.length() != 0){names.append(",");}names.append(name);try {if(values.length() != 0){values.append(",");}Object fieldData = field.get(obj);if(type.equals("varchar")){values.append("'");}values.append(fieldData);if(type.equals("varchar")){values.append("'");}} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}String sql = "INSERT INTO " + tableName + "(" + names.toString() + ") VALUES(" + values.toString() + ");";return sql;}}

你觉得反射好不好?好,有两个方向

第一个方向:无视修饰符访问类中的内容。但是这种操作在开发中一般不用,都是框架底层来用的。

第二个方向:反射可以跟配置文件结合起来使用,动态的创建对象,动态的调用方法。

总结

1.反射案例 – 万能数组扩展
注意:
1.泛型的使用
2.利用Array操作数组

2.反射案例 – 业务与逻辑分离的思想
注意:
1.理解思想
2.灵活使用配置文件
3.理解数据中心DataCenter

3.反射案例 – 操作注解
注意:
1.理解注解是可以给类、属性、方法提供额外信息

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

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

相关文章

实现Node.js安装与配置。

一 、Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;用于构建高性能、可扩展的网络应用程序。它发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;允许使用JavaScript进行服务器端编程&#xff0c;使开发者能够在前后端都使用同一种编程…

Unity 新版输入系统(Input System)

前言 官方教程 注意 新的输入系统需要 Unity 2019.4 和 .NET 4 运行时。它不适用于 .NET 3.5 的项目。 教程版本&#xff1a;Unity 2021.3.26 1. 安装 1.1 打开 Package Manager 导航栏 -> Window -> Package Manager 1.2 安装 Input System 选择 Unity Registry 在列…

RabbitMQ, DelayQueue, Redis的介绍以及IDEA的实现

RabbitMQ RabbitMQ是一个开源的消息队列中间件&#xff0c;它实现了高效、可靠的消息传递机制。它支持多种消息传递模式&#xff0c;如发布/订阅、点对点、请求/回应等。RabbitMQ以其可靠性、灵活性和易用性受到广泛的关注和应用。 RabbitMQ基于AMQP&#xff08;Advanced Mess…

孙中亮:北斗三十周年,看北斗芯片高质量发展历程和方向

1994年1月10日&#xff0c;北斗一号建设正式启动&#xff0c;党中央决策建设独立自主的北斗卫星导航系统。2020年7月31日&#xff0c;北斗三号全球卫星导航系统正式开通&#xff0c;标志着北斗系统进入全球化发展新阶段。随着2024年的到来&#xff0c;北斗系统建设已走过栉风沐…

汇智知了堂走进宜宾学院,共话国产化信创未来!

在春意盎然的四月&#xff0c;汇智知了堂以其深厚的品牌底蕴和卓越的教育品质&#xff0c;再次展现了其在教育领域的领先地位。4月18日&#xff0c;汇智知了堂走进宜宾学院&#xff0c;为广大学子带来了一场关于国产化信创时代的技术变革与专业学习建议的讲座。 汇智知了堂作…

2024深圳杯(东三省)数学建模挑战赛D题:音板的振动模态分析与参数识别思路代码成品论文分析

​ 更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯&#xff08;东三省&#xff09;数学建模挑战赛2024D题&#xff1a;音板的振动模态分析与…

YoloV9改进策略:注意力改进、Neck层改进_自研全新的Mamba注意力_即插即用,简单易懂_附结构图_检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能&#xff0c;导入就需要先下载一个模板&#xff0c;然后在模板文件中填写内容&#xff0c;最后导入模板&#xff0c;导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下&#xff1a; import {MessageBox,Mes…

赋能数据检索:构建用于www.sohu.com的新闻下载器

引言 在信息爆炸的时代&#xff0c;随着新闻数据的数量不断增长&#xff0c;获取和分析这些数据变得尤为关键。本文将介绍如何构建一个高效的新闻下载器&#xff0c;专门用于从搜狐网&#xff08;www.sohu.com&#xff09;检索和下载新闻内容。 背景介绍 搜狐网作为中国领先…

40. 【Android教程】AsyncTask:异步任务

在前面的章节有提到过&#xff0c;Android 系统默认会在主线程&#xff08;UI 线程&#xff09;执行任务&#xff0c;但是如果有耗时程序就会阻塞 UI 线程&#xff0c;导致页面卡顿。这时候我们通常会将耗时任务放在独立的线程&#xff0c;然后通过 Handler 等线程间通信机制完…

外贸干货|客户迟迟不付款,怎么催?

(一) Gentle reminder 温馨提醒 "Hello Mary, l hope this message finds you well. l wanted to kindly remind you about the payment for our agreed-upon order. We appreciate your business and would like to proceed with the next steps as soon as possible.…

DS32K查看内置寄存器数值

需要在debug的时候进行查看&#xff0c;先暂停&#xff0c;再打开EmbSys Registers窗口。 需要先将导出的内容选中并双击&#xff0c;不然复制出来会变成问号。右上角有个复制按钮&#xff0c;复制到剪贴板就行。譬如我这里选择了MCR寄存器&#xff0c;复制出来的就是这个寄存器…

下载nvm来配置node版本

背景提示&#xff1a;入职的公司项目久远&#xff0c;一直运行不起来&#xff0c;原来是我node版本太高&#xff0c;需要降级才行。然后找到这个nvm配置一下 准备工作 如果电脑有配置node的&#xff0c;需要先卸载掉才能配置nvm&#xff01;&#xff01;&#xff01;这是重点嗷…

大模型解决方案:具体业务场景下的智能表单填充(附代码)

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型…

JS -正则表达式

正则表达式 关于正则表达式&#xff0c;其实我写过几篇了&#xff0c;但是真正的正则表达式其实主要用于定义一些字符串的规则&#xff0c;计算机根据给出的正则表达式&#xff0c;来检查一个字符串是否符合规则。 我们来看一下&#xff0c;在JS中如何创建正则表达式对象。 语…

第67天:APP攻防-Frida反证书抓包移动安全系统资产提取评估扫描

思维导图 案例一&#xff1a;内在-资产提取-AppinfoScanne AppinfoScanner 一款适用于以 HW 行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具&#xff0c;可以帮助渗透测试工程师、攻击队成员、红队成员快速收集到移动端或者静态 WEB …

【禅道客户案例】小反馈,大杠杆!银丰新融「反馈管理」优秀实践

企业介绍 北京银丰新融科技开发有限公司&#xff08;简称&#xff1a;银丰新融&#xff09;成立于2000 年&#xff0c;自创立以来一贯专注于金融监管、风险管控等领域的信息系统建设&#xff0c;拥有目前国内金融风险领域规模庞大的信息技术服务团队。 银丰新融业务范围覆盖了…

VUE3 ref,props,生命周期

1.--ref属性 1.1代码 1.1.1子表 <template><div class"person"><h1>中国</h1><h2 ref"title2">北京</h2><h3>尚硅谷</h3><button click"showLog">点我输出h2这个元素</button>&l…

JavaScript注释:单行注释和多行注释详解

为了提高代码的可读性&#xff0c;JS与CSS一样&#xff0c;也提供了注释功能。JS中的注释主要有两种&#xff0c;分别是单行注释和多行注释。 在编程的世界里&#xff0c;注释是那些默默无闻的英雄&#xff0c;它们静静地站在代码的背后&#xff0c;为后来的维护者、为未来的自…

到底什么是爬虫

1. 引言 在数据驱动的世界里&#xff0c;网络爬虫&#xff08;Web Crawling&#xff09;技术扮演着获取和处理网上数据的关键角色。无论是为了数据分析、机器学习项目的数据集构建还是简单地监测网页变化&#xff0c;学习如何创建一个基本的网页爬虫可以大大提升你的工作效率和…