泛型&反射

SpringBoot中使用泛型&反射进行多表数据同步 1.业务描述 一次开发中,遇到接收多个表的数据,并批量插入数据库的需求,在此记录 代码逻辑 2.实际开发 因为涉及到的表有很多,差不多4,50个,所以考虑使用泛型和反射来简化代码,提高开发效率 2.1 接收数据bean 样例中会精简部分代码 /** * 数据同步到保信--请求参数 * Created by Youdmeng on 2019/6/4 0004. */ @Data public class SaveToBaoxin { private String syncId; / 阅读详情


1. 泛型


1.1基本知识:

基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例)!

 作用:   泛型是JDK1.5以后才有的, 可以在编译时期进行类型检查,且可以避免频繁类型转化!

1.2 泛型擦除:   泛型只在编译时期有效,编译后的字节码文件中不存在有泛型信息!






/*

     * 泛型擦除实例

     

    public void save(List<Person> p){

    }

    public void save(List<Dept> d){    // 报错: 与上面方法编译后一样

    }

    */










1.3.泛型写法:

@Test


    public void testGeneric3() throws Exception {


        // 声明泛型集合,集合两端类型必须一致


        List<Object> list = new ArrayList<Object>();


        List<String> list1 = new ArrayList<String>();


        List list2 = new ArrayList<String>();


        List<Integer> list3 = new ArrayList();


       


        // 错误


        //List<Object> list4 = newArrayList<String>();


        // 错误: 泛型类型必须是引用类型,不能为基本类型


        List<int> list5 = new ArrayList<int>();

    }


1.4泛型方法

public class GenericDemo {

 

    // 定义泛型方法

    public <K,T>T save(T t,K k) {

        return null;

    }

   

    // 测试方法

    @Test

    public void testMethod() throws Exception {

        // 使用泛型方法:  在使用泛型方法的时候,确定泛型类型

        save(1.0f, 1);

    }

}

1.5泛型类:

public class GenericDemo<T> {

 

    // 定义泛型方法

    public <K> T save(T t,K k) {

        return null;

    }

   

    public void update(T t) {

 

    }

   

    // 测试方法

    @Test

    public void testMethod() throws Exception {

       

        // 泛型类:  在创建爱泛型类对象的时候,确定类型

        GenericDemo<String> demo = new GenericDemo<String>();

        demo.save("test", 1);

    }

}

1.6泛型接口



/**

 * 泛型接口

 * @author Jie.Yuan

 *

 * @param <T>

 */

public interface IBaseDao<T> {

    void save(T t );

    void update(T t );

}

 

 

泛型接口类型确定: 实现泛型接口的类也是抽象,那么类型在具体的实现中确定或创建泛型类的时候确定

public class BaseDao<T> implements IBaseDao<T> {

 

泛型接口类型确定: 在业务实现类中直接确定接口的类型

public class PersonDao implements IBaseDao<Person>{

 

 


1.7 泛型关键字:


泛型中:


?                               指定只是接收值


extends      元素的类型必须继承自指定的类   上限


super        元素的类型必须是指定的类的父类   下限


快捷键:

Ctrl + shift + R   查看当前项目中类


 Ctrl + shift + T   查看源码jar包中的类


1.8 泛型的反射:


案例,设置通用方法时,会用到反射泛型!



反射泛型涉及API:


Student   类型的表示


Id   name


ParameterizedType   参数化类型的表示


ArrayList<String>();


 


Type   接口,任何类型默认的接口!


       包括:引用类型、原始类型、参数化类型


 


List<String> list   =  new  ArrayList<String>();


泛型集合:    list


集合元素定义:new  ArrayList<String>();  中的String


参数化类型:  ParameterizedType


即:“ArrayList<String>” 为参数化类型



public class AdminDao extends BaseDao<Admin> {}

public class AccountDao extends BaseDao<Account> {}

 

 

/**

 * 所有dao的公用的方法,都在这里实现

 * @author Jie.Yuan

 *

 */

public class BaseDao<T>{

   

    // 保存当前运行类的参数化类型中的实际的类型

    private Class clazz;

    // 表名

    private String tableName;

   

   

   

    // 构造函数: 1. 获取当前运行类的参数化类型; 2. 获取参数化类型中实际类型的定义(class)

    public BaseDao(){

        //  this  表示当前运行类  (AccountDao/AdminDao)

        //  this.getClass()  当前运行类的字节码(AccountDao.class/AdminDao.class)

        //  this.getClass().getGenericSuperclass();  当前运行类的父类,即为BaseDao<Account>

        //                                           其实就是“参数化类型”, ParameterizedType  

        Type type = this.getClass().getGenericSuperclass();

        // 强制转换为“参数化类型”  【BaseDao<Account>】

        ParameterizedType pt = (ParameterizedType) type;

        // 获取参数化类型中,实际类型的定义  【new Type[]{Account.class}】

        Type types[] =  pt.getActualTypeArguments();

        // 获取数据的第一个元素:Accout.class

        clazz = (Class) types[0];

        // 表名  (与类名一样,只要获取类名就可以)

        tableName = clazz.getSimpleName();

    }

   

 

    /**

     * 主键查询

     * @param id    主键值

     * @return      返回封装后的对象

     */

    public T findById(int id){

        /*

         * 1. 知道封装的对象的类型

         * 2. 表名【表名与对象名称一样, 且主键都为id】

         *

         * 即,

         *   ---》得到当前运行类继承的父类  BaseDao<Account>

         *   ----》 得到Account.class

         */

       

        String sql = "select * from " + tableName + " where id=? ";

        try {

            return JdbcUtils.getQuerrRunner().query(sql, new BeanHandler<T>(clazz), id);

        } catch (SQLException e) {

            throw new RuntimeException(e);

        }

    }

   

   

    /**

     * 查询全部

     * @return

     */

    public List<T> getAll(){

        String sql = "select * from " + tableName ;

        try {

            return JdbcUtils.getQuerrRunner().query(sql, new BeanListHandler<T>(clazz));

        } catch (SQLException e) {

            throw new RuntimeException(e);

        }

    }

}

 


反射,可以在运行时期动态创建对象;获取对象的属性、方法;

 










dbUtils常用结果集BeanHandler、BeanListHandler、MapHandler、MapListHandler转Json串 【dbUtils常用结果集[BeanHandler]、[BeanListHandler]、[MapHandler]、[MapListHandler]查询结果转Json串】 立即下载

相关推荐

基于多智能体深度强化学习的空地协同通信系统轨迹设计与访问控制

所属子方向: UAV assisted communication 名词注释 coordinated:协调、协同 base stations 基站,公用移动通信基站,是移动设备接入互联网的接口设备,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。 UAV-BS:无人机基站 cooperative-competitive game:合作竞争博弈 throughput :吞吐量,每秒比特数 bps,bits per second Determinis

skysys的研究小屋 4969

Apache Common DBUtils源码研究(1)

    BeanListHandler 是可供DBUtils查询器使用的一个Handler类,它的作用是将查询结果转换为一个列表。列表中元素为查询结果所转换的JavaBean,Bean的类型为开发者所指定的Class。参考如下这段代码:   public Template[] list(Connection conn, String owner, String catagory) {   ...

晶莹的代码 409

X猫免费小说安卓逆向分析

七猫免费小说安卓逆向分析 难度(♥♥) 文章目录七猫免费小说安卓逆向分析 难度(♥♥)1. 查壳2. 抓包分析3. sign1. Frida-rpc2. Native函数分析快3点了. 睡觉~ 白天再继续写! 1. 查壳 我这边使用的是ApkTool, 拖进去显示未加壳。 2. 抓包分析 POST https://xiaoshuo.wtzw.com/api/v1/login/index HTTP/1.1 net-env: 1 channel: qm-cbcpa056_wm is-white: 0 platf

Qiled的博客 4367

泛型你真的了解吗

你需要掌握的:基本用法 泛型擦除 泛型类/泛型方法/泛型接口 泛型关键字 反射泛型 和泛型的初次见面泛型是JDK1.5以后才有的, 可以在编译时期进行类型检查,且可以避免频繁类型转化。很明显,使用Java泛型,我们可以省掉强制类型转换。编译器会保留参数的类型信息,执行类型检查,执行类型转换操作。因此开发人员不需要自己确保类型转换的安全性,而把这个交给编译器去做。基本使用 public void

chengyunyi的专栏 1547

ESP32搭配LVGL显示图片的两种方法详解:内部存储 vs 外部文件

本文详细介绍了ESP32搭配LVGL显示图片的两种方法:内部存储与外部文件。内部存储方案适合快速响应的小图片,而外部文件方案则适用于需要灵活更新和大容量图片的场景。通过对比分析,帮助开发者根据项目需求选择最优方案,提升嵌入式系统的UI性能。

weixin_30399821的博客 519

OpenCV函数用法之calibrateCamera

参考链接:opencv中标定函数calibrateCamera_ychl87的专栏-优快云博客 世界坐标系的三维点投影到成像坐标系中的二维点的投影公式如下: 其中(X,Y,Z)为世界坐标系中的三维点; (u,v)为成像面坐标系中的二维点; A为相机的内参数矩阵:(cx,cy)为主光轴点,一般为图像的中心;fx和fy为焦距; [R|t]为相机的外参数矩阵:R为旋转矩阵,t为位移矩阵; 上述公式的简单推理过程如下 考虑到镜头畸变 其中,k1,k2,k3,k4,k5和k6为径向畸变,p1和.

tiger&sheep的博客 3万+

BeanListHandler

https://blog.youkuaiyun.com/ln831015/article/details/1678776https://blog.youkuaiyun.com/chuck_kui/article/details/50924101种类:ArrayHandler:把结果集中的第一行数据转成对象数组。ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。BeanHand...

飞鸿的博客 1万+

适合初学者的ROS机器人教程(1): Ubuntu下ROS创建自己的包和使用github下载的包

ROS如何创建自己的包 1. 首先创建catkin工作空间(如果你以及有了请忽略) $ mkdir catkin_ws # 创建一个文件夹里面计划放我们的项目,ws是workspace的缩写 $ cd catkin_ws # 将当前工作文件夹切换到catkin_ws这个文件夹 ~/catkin_ws$ catkin_make # 执行catkin_make创建一ROS项目 此时你的catkin_...

@司南牧|知乎|博客|易懂教程|李韬 3244

Java之反射&泛型

Java的反射机制是指代码(程序)在运行状态中,对于任意一个类,都能够知道并获得这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类的信息以及动态调用对象的方法的功能称为java的反射机制。要想动态获取一个类的信息,必须先要获取到该类的字节码文件(Class)对象。如图是类的正常加载过程:反射的关键就在于编译加载后的Class文件泛型主要是为了让开发人员在开发时可以在某个场景中定义使用统一的某种类型, 使代码更规范更安全.

m0_64643342的博客 757

CTFShow萌新区全攻略:从密码破解到Web渗透的实战解析

本文为CTFShow萌新区新手提供从密码破解到Web渗透的完整实战攻略。文章深入解析了密码学、隐写术、杂项和Web安全四大核心方向,分享了实用的解题工具、思维方法和绕过技巧,旨在帮助初学者建立系统的安全竞赛解题体系,而不仅仅是提供一份题解(WP)。

weixin_29216957的博客 297

【Coze 扣子案例】第 23 期・商业篇:一键获取精准商机,自动化招标信息查询与分析

通过地区和项目类型等多维度组合查询全国招标信息网数据,实现招标公告的快速定位。自动解析招标公告内容,提取关键信息,并生成结构化摘要。帮助企业高效获取精准商机,提升市场竞争力,降低人工成本,解决 “信息过载” 与 “精准匹配难” 的双重问题。

weixin_72689845的博客 1927

反射&泛型

文章目录前言一、反射1.什么是反射?2.获取Class的几种方式二、泛型1.定义2.泛型类3.泛型方法4.泛型派生出的子类5.通配符6.泛型擦除和桥接方法总结 前言 写这篇文章是因为在阅读源码时,发现在源码中总会应用到反射和泛型,所以经过学习后,总结如下。有不对或者遗漏的地方,也欢迎大家留言指正和讨论。废话不多说,开始整活儿。 一、反射 1.什么是反射? 在讲反射之前,我们先简单说一下jvm类加载的过程。 源代码 – 类编译器将源码编译为class文件 – 类加载器(classLoader)将class文件

m0_55253546的博客 280

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

努力让自己发光,对的人才能迎着光而来 9万+

泛型 & 反射

参考文章: https://cloud.tencent.com/developer/article/1033693 什么是反射?反射机制的应用场景有哪些? 10 道 Java 泛型面试题(强推) Java 泛型进阶(强推) Java中数组为什么不支持泛型,集合却支持泛型? 反射常见面试题 简单介绍一下反射 思路:概述 --- 获取字节码对象的方式 -- 方法的使用 --- 优...

Lucky小黄人的博客 318

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java基础之泛型&反射

a.泛型 含义:是JDK1.5的新特性,本质是参数化类型,即所操作的数据类型被指定为一个参数,使用时通过传参来指定具体的类型。 好处:安全简单。具体体现在提供编译时的强类型检查,而不用等到运行;可避免类类型强制转换;增强代码可读性。 //不使用泛型需要强制转换 List list = new ArrayList(); list.add("hello"); String s = (String) l...

zuo_er_lyf的博客 191

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 泛型&类库&枚举&反射机制 要点

本文总结了Java知识点中关于泛型、Java类库、枚举、Java反射机制的要点内容,想复习该方面知识点的可以进入一览。

亮点菌 1692

Java学习-反射&泛型&注解

Java反射的学习和注解的学习和泛型的学习,包括反射的基本介绍、反射机制的运用、类型擦除、元注解等

qq_56760790的博客 1215

Java高级(泛型&反射)

(Reflection)是指在运行时动态获取类的信息(如类名、方法、字段、构造函数等)并操作这些信息的能力。包提供支持,允许程序在运行时检查和修改类的结构、调用方法、访问字段或创建对象,即使这些信息在编译时未知。: 表示集合中的元素类型,强调类型是集合(如 List、Set、Queue 等)中的个体元素。在 Java 集合框架中(如 List、Set),E 是标准命名。: 表示通用类型,通常用于表示任意类型或抽象类型。泛型方法可以独立于泛型类,在调用时自动推断类型。表示未知类型,常用于限制类型范围。

qq_44002865的博客 999

java面试题-泛型&异常&反射

泛型&异常&反射的一些面试题

qq_33129875的博客 1376

【Java】反射 & 反射性能 & 反射操作泛型 & 反射操作注解

反射机制 运行时加载,探知,使用编译期间完全未知的类。 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用他的任意一个方法和属性。 jvm加载完类之后,在堆内存中,就产生了一个对应的Class类型的对象,这个对象就包含了完整的类的结构信息。Class(大写c)是一个类。 一个类只有一个Class反射对象。 ...

不会写代码的狗子 386

泛型&反射笔记,应用场景

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

weixin_44673447的博客 260

反射&泛型&容器(ArrayList,LinkedList,HashMap)

关于反射,泛型的使用以及扩展知识,如类型擦除,桥接方法,泛型的上下限。简单汇总容器的原理

qq_44450547的博客 127

482. Java 反射 - 访问私有方法 & 泛型擦除的影响

摘要: 本文探讨Java反射中两个关键问题: 访问私有方法:通过setAccessible(true)绕过访问控制检查,但需注意模块系统(Java 9+)的额外限制; 泛型擦除影响:运行时泛型类型被擦除,反射操作需基于Object.class而非具体泛型类型,可能破坏类型安全。 总结:反射虽灵活,但需谨慎处理私有访问及类型擦除带来的潜在风险。

yaoxin521123的博客 208

j6-IO流&泛型&集合&多线程&注解&反射&Socket

IO流&泛型&集合&多线程&注解&反射&Socket

猛志的博客 724
上一篇: 常用的增删改查的实现之dao层
下一篇: Java开发中的注解技术
2YSP
博客等级 码龄10年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值