今天分享给大家一个实用的开发技巧, 创建一个返回值为泛型的对象构建函数, 要求是传入返回值类的 class 对象.

例如: 平时我们开发接口的时候发现很多响应类里面基本都会有`code`和`error`两个属性, 而且有的人会将常量的枚举值作为接口调用成功的返回值, 这时候每次都会在接口的末尾处 new 一个接口响应值返回给调用者, 而这时候我们可以统一将这个创建含有成功响应值对象封装为一个方法.

为了节省更多重复代码, 我们会将封装这个方法定义在一个父类中.

​ 父类代码改造前代码:

/**
* @Title: BaseResponse
* @Description:
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
@Data
@NoArgsConstructor
public class BaseResponse implements Serializable { <p style="text-indent:2em"/>private static final long serialVersionUID = -8383361046902228836L; <p style="text-indent:2em"/>protected String code;
<p style="text-indent:2em"/>protected String errorMsg; }

思路: ①由于我们不能创建一个对象传入而返回, 这样就无法达到我们减少代码量的需求了, 所以就要用到 java 的反射机制去构建对象, 最后得到参数为 class 对象. ②既然是在父类中定义, 那构建的对象必须就是它的子类, 这时候就需要用到泛型去限制了.

ok, 整理好思路了就开始改造父类了.

父类代码改造后代码 :

/**
* @Title: BaseResponse
* @Description:
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
@Data
@NoArgsConstructor
public class BaseResponse implements Serializable { <p style="text-indent:2em"/>private static final long serialVersionUID = -8383361046902228836L; <p style="text-indent:2em"/>protected String code;
<p style="text-indent:2em"/>protected String errorMsg; <p style="text-indent:2em"/>public static <T extends BaseResponse> T setResult(Class<T> tClass, ResponseEnum responseEnum) throws Exception {
<p style="text-indent:2em"/><p style="text-indent:2em"/>Constructor<T> constructor = tClass.getConstructor(ResponseEnum.class);
<p style="text-indent:2em"/><p style="text-indent:2em"/>return constructor.newInstance(responseEnum);
<p style="text-indent:2em"/>} <p style="text-indent:2em"/>/**
<p style="text-indent:2em"/> * 调用的子类需要重写父类的 BaseResponse(ResponseEnum responseEnum) 构造器
<p style="text-indent:2em"/> */
<p style="text-indent:2em"/>public static <T extends BaseResponse> T success(Class<T> tClass) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>try {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>return setResult(tClass, ResponseEnum.NORMAL_SUCCESS);
<p style="text-indent:2em"/><p style="text-indent:2em"/>} catch (Exception e) {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>e.printStackTrace();
<p style="text-indent:2em"/><p style="text-indent:2em"/>}
<p style="text-indent:2em"/><p style="text-indent:2em"/>return null;
<p style="text-indent:2em"/>} <p style="text-indent:2em"/>public static <T extends BaseResponse> T failure(Class<T> tClass) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>try {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>return setResult(tClass, ResponseEnum.SYSTEM_ERROR);
<p style="text-indent:2em"/><p style="text-indent:2em"/>} catch (Exception e) {
<p style="text-indent:2em"/><p style="text-indent:2em"/><p style="text-indent:2em"/>e.printStackTrace();
<p style="text-indent:2em"/><p style="text-indent:2em"/>}
<p style="text-indent:2em"/><p style="text-indent:2em"/>return null;
<p style="text-indent:2em"/>} <p style="text-indent:2em"/>public BaseResponse(ResponseEnum responseEnum) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.code = responseEnum.code();
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.errorMsg = responseEnum.errorMsg();
<p style="text-indent:2em"/>} }

响应枚举 ResponseEnum.java:

/**
* @Title: ResponseEnum
* @Description: 响应类实体
* @author: deWei
* @date: 2022/3/12 18:28
* @Version: 1.0
*/
public enum ResponseEnum { <p style="text-indent:2em"/>NORMAL_SUCCESS("000000", "成功"),
<p style="text-indent:2em"/>SYSTEM_ERROR("000001", "系统异常"); <p style="text-indent:2em"/>private final String code;
<p style="text-indent:2em"/>private final String errorMsg; <p style="text-indent:2em"/>ResponseEnum(String code, String errorMsg) {
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.code = code;
<p style="text-indent:2em"/><p style="text-indent:2em"/>this.errorMsg = errorMsg;
<p style="text-indent:2em"/>} <p style="text-indent:2em"/>public String code() {
<p style="text-indent:2em"/><p style="text-indent:2em"/>return code;
<p style="text-indent:2em"/>} <p style="text-indent:2em"/>public String errorMsg() {
<p style="text-indent:2em"/><p style="text-indent:2em"/>return errorMsg;
<p style="text-indent:2em"/>}
}

给定class对象返回该类的实例的更多相关文章

  1. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  2. C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

    转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的 ...

  3. 本文使用springMVC和ajax,实现将JSON对象返回到页面

    一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...

  4. C++11用于计算函数对象返回类型的统一方法

    [C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...

  5. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  6. php xml格式对象 返回->对应格式数组

    /*     * $objXml xml格式对象      * 返回 : 对应格式数组     */    public function XmlString2Arr($xml)    {       ...

  7. easyUIDataGrid对象返回值

    import java.util.List; /** * easyUIDataGrid对象返回值 * <p>Title: EasyUIResult</p> * <p> ...

  8. JS window对象 返回前一个浏览的页面 back()方法

    JS window对象 返回前一个浏览的页面 back()方法,加载 history 列表中的前一个 URL. 语法: window.history.back();   返回前一个浏览的页面 back ...

  9. valueOf()对象返回值

    valueOf()对象返回值 Array数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起.其操作与 Array.toString 和 Array.join 方法相同. Boolean为Boo ...

随机推荐

  1. Android App发布遇到的问题总结【转】

    感谢大佬:https://www.cnblogs.com/jeffen/p/6824722.html   问题描述(v1和v2) Android 7.0中引入了APK Signature Scheme ...

  2. linux修改root用户登陆密码

    如果不是以root用户登录的,请先切换到root用户下, 执行命令:su root 然后按提示输入root用户的密码. 英文系统: [root@localhost ~]# passwd Changin ...

  3. axios取消接口请求

    axios取消请求 这里就是分析一下接口请求需要被取消时的一些操作 因为我是用vue写的项目,所以标配用的是axios,怎么在axios中取消已经发送的请求呢? 1.在这之前我们还是先介绍一下原生js ...

  4. endl与\n的区别

    看C++Primer的时候看到的,然后去百度了一下: 比较明白的解释: 1.区别在于: \n只代表换行的转义字符 endl除了代表换行,还紧跟着清出缓冲槽 2.接下来我们看一下具体内容的辨析: 要明白 ...

  5. Redis和数据库的数据一致性问题

    在数据读多写少的情况下作为缓存来使用,恐怕是Redis使用最普遍的场景了.当使用Redis作为缓存的时候,一般流程是这样的. 如果缓存在Redis中存在,即缓存命中,则直接返回数据 如果Redis中没 ...

  6. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  7. JVM学习——类加载机制(学习过程)

    JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...

  8. Understanding JSON Schema

    json schema 在线校验器 译自:Understanding JSON Schema { "type": "object", "propert ...

  9. Gradle进行Build 报GBK错误

    如上图,码主电脑windows,公司用的gradle进行项目build,本地进行build,总是出现这种GBK错误. 本身知道这是文件的编码问题:一般文件都是UTF-8编码,compilejava 默 ...

  10. RainbowCrack彩虹表破解密码hash

    实验目的 使用彩虹表破解散列值b0baee9d279d34fa1dfd71aadb908c3f 实验原理 1)彩虹表破解是利用彩虹表破解散列数据的工具. 这种方法不同于暴力破解攻击.暴力破解攻击会将密 ...