java 获取泛型T的class对象

问题描述

最近在封装es方法的时候遇到一个问题,就是泛型T怎么获取对应的class对象,代码如下:

/**
 * @Author: hrd
 * @CreateTime: 2023/11/27 15:08
 * @Description:
 */
public interface IESIndex<R, P extends BaseModel> {

    /**
     *
     * @param p
     * @param id 唯一ID
     * @return
     */
    IndexResponse saveOrUpdateById(P p, String id);

    R list(R r);

    R getListByIds(String... ids);

    DeleteResponse deleteById(String id);

    BulkByScrollResponse deleteByQuery(QueryBuilder queryBuilder);

    @NotNull
    default String buildOrder() {
        return "createTime";
    }

    default QueryBuilder getQueryBuilder(P p) {
        return null;
    }
}
/**
 * @Author: hrd
 * @CreateTime: 2023/11/30 13:57
 * @Description:
 */
@Slf4j
@Component
@RequiredArgsConstructor
public abstract class ESIndexServer<T extends BaseModel> implements IESIndex<PageResult<T>, T> {


    private final RestHighLevelClient restHighLevelClient;

    protected abstract String getIndexName();


    @Override
    public IndexResponse saveOrUpdateById(T p, String id) {
        if (null == p || null == id || "".equals(id)) {
            return null;
        }
        IndexRequest request = new IndexRequest(this.getIndexName()).id(id);
        // 2.准备参数
        request.source(JSON.toJSONString(p), XContentType.JSON);
        try {
            IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
            log.info("es:{}", index);
            return index;
        } catch (IOException e) {
            log.error("es:error", e);
        }
        return null;
    }


    @SuppressWarnings("unchecked")
    public Class<T> getTypeClass() {
        Type type = getClass().getGenericSuperclass();
        if (!(type instanceof ParameterizedType)) {
            throw new IllegalStateException("Type must be a parameterized type");
        }
        ParameterizedType parameterizedType = (ParameterizedType) type;
        // 获取泛型的具体类型  这里是单泛型
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        if (null == actualTypeArguments || actualTypeArguments.length < 1) {
            throw new IllegalStateException("Number of type arguments must be 1");
        }
        return (Class<T>) actualTypeArguments[0];
    }


    @Override
    public PageResult<T> list(PageResult<T> pageResult) {
        SearchRequest request = new SearchRequest(this.getIndexName());
        // 2.准备请求参数
        // 2.2.分页
        buildQuery(pageResult.getQueryCondition(), request);
        int page = pageResult.getPage();
        int size = pageResult.getSize();
        request.source().from((page - 1) * size).size(size);
        String orderField = buildOrder();
        if (!StringUtils.isEmpty(orderField)) {
            request.source().sort(SortBuilders.fieldSort(orderField).order(SortOrder.DESC));
        }
        try {
            SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
            return handleResponse(pageResult, search);
        } catch (IOException e) {
            log.error("es:list error", e);
        }
        return pageResult;
    }

    @Override
    public PageResult<T> getListByIds(String... ids) {
        if (null == ids || ids.length == 0) {
            return new PageResult<>();
        }
        SearchRequest request = new SearchRequest(this.getIndexName());
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.filter(QueryBuilders.idsQuery().addIds(ids));
        request.source().query(boolQuery);
        try {
            SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
            return handleResponse(search);
        } catch (IOException e) {
            log.error("es:list error", e);
        }
        return new PageResult<>();
    }


    @Override
    public DeleteResponse deleteById(String id) {
        DeleteRequest request = new DeleteRequest(this.getIndexName(), id);
        // 2.发送请求
        try {
           return restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public BulkByScrollResponse deleteByQuery(QueryBuilder queryBuilder) {
        DeleteByQueryRequest request = new DeleteByQueryRequest(this.getIndexName());
        request.setQuery(queryBuilder);
        // 2.发送请求
        try {
            return restHighLevelClient.deleteByQuery(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 处理分页结果
     *
     * @param pageResult
     * @param response
     * @return
     */
    protected PageResult<T> handleResponse(PageResult<T> pageResult, SearchResponse response) {
        SearchHits searchHits = response.getHits();
        long total = searchHits.getTotalHits().value;
        SearchHit[] hits = searchHits.getHits();
        List<T> list = new ArrayList<>(hits.length);
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            list.add(JSON.parseObject(json, this.getTypeClass()));
        }
        pageResult.setTotal(total);
        pageResult.setList(list);
        pageResult.setQueryCondition(null);
        return pageResult;
    }

    protected PageResult<T> handleResponse(SearchResponse response) {
        return this.handleResponse(new PageResult<>(), response);
    }

    /**
     * 过滤条件
     *
     * @param params
     * @param request
     */
    protected void buildQuery(T params, SearchRequest request) {
        String[] filterQuery = getFilterQuery();
        if (null != params) {
            // 1.准备Boolean查询
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            Map<String, String> map = params.toMap();
            for (String key : filterQuery) {
                String value = map.get(key);
                if (key != null && value != null) {
                    boolQuery.filter(QueryBuilders.termQuery(key, value));
                }
            }
            QueryBuilder queryBuilder = getQueryBuilder(params);
            if (null != queryBuilder) {
                boolQuery.filter(queryBuilder);
            }
            // 3.设置查询条件
            request.source().query(boolQuery);
        }
    }

    protected abstract String[] getFilterQuery();


}

在这里插入图片描述

这个里面涉及到返回结果json字符串转对象,然后需要对象的获取对应class,而我们这里的对象又是一个泛型,无法直接获取其class.下面的获取泛型对象的class的方法

    @SuppressWarnings("unchecked")
    public Class<T> getTypeClass() {
        Type type = getClass().getGenericSuperclass();
        if (!(type instanceof ParameterizedType)) {
            throw new IllegalStateException("Type must be a parameterized type");
        }
        ParameterizedType parameterizedType = (ParameterizedType) type;
        // 获取泛型的具体类型  这里是单泛型
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        if (null == actualTypeArguments || actualTypeArguments.length < 1) {
            throw new IllegalStateException("Number of type arguments must be 1");
        }
        return (Class<T>) actualTypeArguments[0];
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#结合JavaScript实现多文件上传

目录 需求 引入 关键代码 操作界面 ​JavaScript包程序 服务端 ashx 程序 服务端上传后处理程序 小结 需求 在许多应用场景里&#xff0c;多文件上传是一项比较实用的功能。实际应用中&#xff0c;多文件上传可以考虑如下需求&#xff1a; 1、对上传文件的类型、大小…

风险评估是什么,为什么被称为保护网络安全的重要一环!

随着互联网的普及和信息技术的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络在为我们带来便利的同时&#xff0c;也存在着各种安全风险。因此&#xff0c;进行网络风险评估是保护网络安全的重要一环。而为什么说风险评估是保护网络…

2.2 C语言之常量

2.2 C语言之常量 一、常量 一、常量 类似于1234的整数常量属于int类型。 printf("%d\n", 1234);long类型的常量以l或L结尾 printf("%d\n", 123456789l);printf("%d\n", 123456789L);如果一个整数太大&#xff0c;以至于无法用int类型表示时&…

LINUX-ROS集成安装MQTT库步骤注意事项

环境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步骤 安装doxygen sudo apt install doxygen 构…

Tomcat从认识安装到详细使用

文章目录 一.什么是Tomact?二.Tomcat的安装1.下载安装包2.一键下载3.打开Tomcat进行测试4.解决Tomcat中文服务器乱码 三.Tomcat基本使用1.启动与关闭Tomcat2.Tomcat部署项目与浏览器访问项目 四.Tomcat操作中的常见问题1.启动Tomcat后&#xff0c;启动窗口一闪而过&#xff1f…

Day15——File类与IO流

1.java.io.File类的使用 1.1 File类的理解 File 类及本章下的各种流&#xff0c;都定义在 java.io 包下。一个 File 对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xf…

金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞分析

文章目录 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞分析前言一、漏洞描述二、影响版本三、POC四、漏洞原理分析参考链接&#xff1a; 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞分析 前言 免责声明&#xff1a;请勿利用文章内的相…

idea 本身快捷键ctrl+d复制 无法像eclipse快捷键ctrl+alt+上下键,自动换行格式问题解决

问题 例如我使用ctrld 想复制如下内容 复制效果如下&#xff0c;没有自动换行&#xff0c;还需要自己在进行调整 解决 让如下快捷键第一个删除 修改成如下&#xff0c;将第二个添加ctrld 提示&#xff1a;对应想要修改的item&#xff0c;直接右键&#xff0c;remove是删…

Nginx反向代理跳过国内备案(以宝塔面板为例)

需要两台服务器&#xff0c;一台已备案或者免备案&#xff0c;一台国内主力服务器放你的项目。 先把域名解析到A服务器 然后在A服务器里配置 server {listen 80;server_name 你的域名;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_…

(3)kylin系统部署weblogic项目

一、jdk迁移 1、拷贝成功后要配置环境变量 vi /etc/profile 将jdk的目录添加进去 2、将jdk安装目录拷贝后权限会发生变化&#xff0c; 要对jdk下bin目录中的所有文件修改权限&#xff1a; chmod x ./* 回车即可 ----------------------------- 环境变量 export …

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址&#xff1a;GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-…

编程学新要求:OS发布之前,都应该在各种虚拟机上测试

这几天在VirtualBox上安装ArchLinux&#xff0c;掌握了方法之后&#xff0c;非常顺利。进入桌面之后&#xff0c;又出问题了&#xff0c;如下图&#xff1a; 底部的那个工具条&#xff0c;空空如也。原因是显示错误。这怎么用&#xff1f; 所以编程学干脆提出一个新要求&#x…

leetcode 股票DP系列 总结篇

121. 买卖股票的最佳时机 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。 只能进行一次交易 很简单&#xff0c;只需边遍历边记录最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"..."&#xff1a;表单标签&#xff0c;供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio"&#xff1a;输入类型为单选框。把name设置为一样的&#xff0c;这样效果上就是单选&#xff…

C++ 对象数组

对象数组用于创建同一个类的多个对象。声明对象数组的方法与声明标准类陷阱数组相同。以Stock类为例&#xff1a; class Stock { private:std::string company;int shares;double share_val;double total_val;void set_tot(){return total_val shares * share_val;} public:S…

基于Java SSM框架实现电影售票系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现电影售票系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

SU渲染受到电脑性能影响大吗?如何提高渲染速度

一般3d设计师们在进行设计工作前都需要提供一台高配电脑&#xff0c;那么你这知道su渲染对电脑要求高吗&#xff1f;电脑带不动su怎么解决&#xff1f;su对电脑什么配件要求高&#xff1f;今天这篇文章就详细为大家带来电脑硬件对su建模渲染的影响&#xff0c;以及su渲染慢怎么…

Flask应用基础入门总结

【1】使用migrate方式进行数据库连接 使用migrate方式进行数据库连接需要在终端分别运行三行代码&#xff1a; #init&#xff08;运行一次即可&#xff09;&#xff08;此db为自己设置的连接数据库的对象,可以修改&#xff09; flask db init #&#xff08;将orm模型生成迁移…