给定class对象返回该类的实例
今天分享给大家一个实用的开发技巧, 创建一个返回值为泛型的对象构建函数, 要求是传入返回值类的 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对象返回该类的实例的更多相关文章
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的 ...
- 本文使用springMVC和ajax,实现将JSON对象返回到页面
一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...
- C++11用于计算函数对象返回类型的统一方法
[C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...
- JavaScript中创建字典对象(dictionary)实例
这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...
- php xml格式对象 返回->对应格式数组
/* * $objXml xml格式对象 * 返回 : 对应格式数组 */ public function XmlString2Arr($xml) { ...
- easyUIDataGrid对象返回值
import java.util.List; /** * easyUIDataGrid对象返回值 * <p>Title: EasyUIResult</p> * <p> ...
- JS window对象 返回前一个浏览的页面 back()方法
JS window对象 返回前一个浏览的页面 back()方法,加载 history 列表中的前一个 URL. 语法: window.history.back(); 返回前一个浏览的页面 back ...
- valueOf()对象返回值
valueOf()对象返回值 Array数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起.其操作与 Array.toString 和 Array.join 方法相同. Boolean为Boo ...
随机推荐
- linux下格式化json文件数据
一.使用 python -m json.tool cat test.json | python -m json.tool 二.jq格式化 在web 2.0时代json这种直观.灵活.高效数据格式基本已 ...
- 自定义 RestTemplate 异常处理 (转)
转自:https://ethendev.github.io/2018/11/06/RestTemplate-error-handler/ 一些 API 的报错信息通过 Response 的 body返 ...
- linux 多个C源文件编译
转载请注明来源:https://www.cnblogs.com/hookjc/ 如果有多个源文件,基本上有两种编译方法: [假设有两个源文件为test.c和testfun.c] 1. 多个文件一起编译 ...
- VC 常用
转载请注明来源:https://www.cnblogs.com/hookjc/ ------------------------------------------------------------ ...
- js表达式和语句
表达式 一个表达式可以产生一个值,有可能是运算.函数调用.有可能是字面量.表达式可以放在任何需要值的地方. 语句 语句可以理解为一个行为,循环语句和判断语句就是典型的语句.一个程序有很多个语句组成,一 ...
- iOS中播放音效
#import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewCont ...
- HashMap 的 7 种遍历方式与性能分析
前言 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从 ...
- Linux 基础练习题
Linux 测试 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 [root@localhost proc]# grep -i '^s' /proc/meminfo [ ...
- Solution -「LOCAL」客星璀璨之夜
\(\mathcal{Description}\) OurOJ. 给定坐标轴上的 \(2n+1\) 个坐标 \(x_1,x_2,\cdots,x_{2n+1}\),其中偶数下标的位置是一个小球 ...
- 前端防抖,double click 克星
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...