泛型&反射

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串】 立即下载

相关推荐

保姆级教程:在RK3588开发板上编译带MPP硬件加速的FFmpeg(含完整依赖库配置)

本文提供在RK3588开发板上编译支持MPP硬件加速的FFmpeg的详细教程,涵盖交叉编译环境搭建、MPP框架及依赖库配置,最终实现4K视频硬件编解码性能优化。通过实战步骤和性能对比,展示如何充分发挥RK3588的硬件加速能力。

weixin_30839881的博客 418

Apache Common DBUtils源码研究(1)

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

晶莹的代码 409

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程

本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。

weixin_42520909的博客 339

泛型你真的了解吗

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

chengyunyi的专栏 1547

数据分析:美团大赛的具体案例制作

在数据集中,存在三个变量的经纬度数据,分别是商家的经纬度数据('sender_lng', 'sender_lat'),顾客的经纬度数据('recipient_lng', 'recipient_lat')和骑手的经纬度数据('grab_lng', 'grab_lat')。根据结果可知,平台订单创建时间的中位数为2022-10-21 02:59:01,平台订单创建时间的众数为2022-10-19 03:29:41、2022-10-23 03:29:47,与直方图相符。接下来,我们对是否为预定订单变量进行分析。

m0_68269346的博客 2496

ICCV 2025 | 哈工大、清华等提出首个双曲学习框架:HLFormer,革新局部相关视频检索

离原点越远,代表的语义越具体(部分)。现有方法大多在传统的欧几里得空间中对视频和文本进行建模,但这往往会导致对视频内在层次结构的错误表示,从而影响检索的准确性。通过UMAP对学习到的帧嵌入进行可视化(如下图),可以观察到,来自同一时刻的视频帧在嵌入空间中聚集在一起,清晰地展示了模型对时序关系的捕捉能力。下图的双曲空间可视化进一步证实了模型的层次建模能力:离原点越近的点,代表的语义层级越高、粒度越粗糙,反之亦然。:既然文本查询描述的是视频的一部分,那么在几何表示上,文本的嵌入向量应该从属于视频的嵌入向量。

我爱计算机视觉 1078

BeanListHandler

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

飞鸿的博客 1万+

某手sig3-ios算法 Chomper黑盒调用

本文主要是介绍Chomper的算法模拟执行,Chomper目前已经已经是能比较完整的模拟ios可执行文件执行的模拟器,在这块有非常大的优势。以前安卓端有强势的unidbg,现在iOS也有Chomper了,后续等待作者持续更新,完善Chomper。强势推荐一波-> Chomper地址: https://github.com/sledgeh4w/chomper。我这块也已经使用Chomper完成雅迪系列、某手的算法调用。后续也会有更多扩展。

成小新的博客 2156

Java之反射&泛型

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

m0_64643342的博客 757

第055篇:陆地观测卫星数据服务平台高级检索方法

检索数据检索到肩膀疼,这谁能信?谁能?

liujinli0712的博客 7823

基于STM32单片机设计的红外测温仪(带人脸检测)_34

当前设计的这款红外非接触式测温仪由测温硬件+上位机软件组合而成,主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并且保存当前人脸照片。

8769

反射&泛型

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

m0_55253546的博客 280

锂电池SOH估计 | 基于LSTM模型的锂电池SOH估计(Python)

锂电池SOH估计 | 基于LSTM模型的锂电池SOH估计(Python)

前程算法屋的博客 1433

泛型 & 反射

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

Lucky小黄人的博客 318

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java基础之泛型&反射

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

zuo_er_lyf的博客 191

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

亮点菌 1692

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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、付费专栏及课程。

余额充值