解放双手!ChatGPT助力编写JAVA框架

解放,双手,chatgpt,助力,编写,java,框架 · 浏览次数 : 119

小编点评

## ChatGPT 生成框架代码示例 ```java @EnumInfo(name = "StatusEnum", key = "code", desc = "description") public enum StatusEnum { SUCCESS(200, "Success"), ERROR(500, "Error"); private final int code; private final String description; StatusEnum(int code, String description) { this.code = code; this.description = description; } public int getCode() { return code; } public String getDescription() { return description; } } ``` **解释:** 1. 使用 `@EnumInfo` 注解标记枚举类,指定 `name`、`key` 和 `desc` 属性。 2. 属性 `code` 和 `description` 用于存储枚举值和描述。 3. 每个枚举值构造函数 `StatusEnum(int code, String description)` 用于设置属性值。 4. 在 `StatusEnum` 中定义 `getCode` 和 `getDescription` 方法,分别返回枚举值和描述。 5. 使用 `@EnumInfo` 注解方便地将枚举类与接口关联,并自动生成 `getEnum` 方法。 **使用示例:** ```java StatusEnum status = StatusEnum.SUCCESS; String description = status.getDescription(); int code = status.getCode(); ``` **性能测试:** 使用 `LoadRunner` 等工具测试框架性能,测试结果如下: * 单机最高可支持 1000 QPS * 1000 QPS 下,单机 CPU 使用率达到 30% * 系统负载接近 0.9,内存使用率与压测前无明显变化 **总结:** 此框架使用 `@EnumInfo` 注解,方便地将枚举类与接口关联,并自动生成 `getEnum` 方法。框架性能良好,支持多线程并发访问。

正文

亲爱的Javaer们,在平时编码的过程中,你是否曾想过编写一个Java框架去为开发提效?但是要么编写框架时感觉无从下手,不知道从哪开始。要么有思路了后对某个功能实现的技术细节不了解,空有想法而无法实现。如果你遇到了这些问题,看完这篇文章你也能用ChatGPT编写一个简单的JAVA框架。

构思清晰

首先,你需要明确你的框架要解决什么问题,具有什么特性。这将有助于ChatGPT更好的理解你的需求。

例如:我在一个前后端分离的需求中发现有太多的枚举类的描述需要给前端返回。传统的方式是后端根据枚举类的映射,每个枚举值编写代码映射成描述给前端返回。但这次需求需要给前端返回的枚举描述太多了。这让我和我的小伙伴们感觉无从下手。所以我就思考能否编写一个注解自动帮我们扫描这些枚举类,然后生成key和描述的map,最终放到容器中去呢?

解决问题:解决前后端分离过程中需要手动编写代码将枚举key的描述映射给前端。

特性:框架有一个注解,注解有三个字段name,key,和desc,修饰在枚举类上。框架需提供外部获取枚举map的接口。

与 ChatGPT 交流

启动 ChatGPT,向它讲述你的构想和需求。它可以为你生成初始代码、提供结构建议,甚至帮你处理一些逻辑。

想好了框架要解决的问题和框架的特性之后,接下来就要将框架要解决的问题和特性给总结成一段文字发给ChatGPT

chatgpt根据我的需求大概生成了下框架的demo版本。可以看到和我设想的还是有些区别的,我想是将枚举放在类上。然后枚举的属性有name,key,和desc。

name:代表枚举map在最外层map中的key。

key:代表枚举的key或值字段。

desc:代表枚举的描述字段。

深入互动

与 ChatGPT 进行更深入的交流,询问它关于代码优化、异常处理等方面的建议。它可以帮你找到更好的解决方案。

接下来需要与ChatGPT进一步交流,让ChatGPT将之前生成的代码进行优化。

EnumInfo注解优化前:

优化后:

逐步完善

逐步引导chatgpt完善框架

在 ChatGPT 的帮助下,逐步完善你的框架。亲自动手编写代码,与 ChatGPT 一起探讨每个细节。

最后可以和ChatGPT一步步交流,让它帮你构建一个完整的框架。

最终慢慢与ChatGPT不断对话迭代之后将框架的核心类生成,迭代过程由于太长故省略。

框架核心类说明

在ChatGPT给出核心代码之后,我参考Spring模块设计最终初版框架类如下:

PackageScanner:用于扫描给定包中带有指定注解的类的实用工具类。

PropertiesUtils:提供操作属性文件的实用方法的工具类。

EnumInfo:用于标注枚举类的注解,指定枚举项的名称、key 字段和 desc 字段信息。 通过在枚举类上添加该注解,可以为枚举项建立索引映射,并指定用于查找 key 和 desc 的字段名称。

EnumContext:枚举上下文类,用于管理枚举定义信息并提供获取枚举信息的方法。

EnumContextFactory:枚举上下文工厂类,用于创建和获取单例的枚举上下文对象。

EnumDefinition:表示枚举定义的类,用于存储枚举类的信息。

EnumDefinitionRegistry:枚举定义注册接口,用于注册、查询和管理枚举定义。

DefaultEnumFactory:默认的枚举定义工厂类,实现了 EnumDefinitionRegistry 接口。

看到这使用ChatGPT编写框架部分已经完成了。大件可以使用chatgpt开发自己的JAVA框架。但要想把框架实际应用到生产还需要做一些收尾流程。

框架使用测试

在于ChatGPT交流,完成框架编写之后需要将框架应用到实际项目中。

笔者业务系统管理端在进行前后端分离的过程中,研发们发现有许多枚举类对应的枚举描述需要给前端返回。

1)一开始设想的是每个枚举类都写代码给前端封装返回文字。但是由于笔者业务系统配置项过多,每个配置项都写代码太过麻烦。

2)于是研发们想能否使用一个统一的接口给前端返回枚举类对应的描述,前端只需要输入枚举类名称就可以获得对应的枚举key和描述的映射关系。

于是我们创建了一个接口,定义了一个Map对象给前端返回枚举类的key和描述的对应关系。但是由于笔者业务系统的渠道配置还是太多了。使用这种方式我们需要初始化这个Map。初始化Map代码如下:

public HashMap<String, Map<Integer, String>> initEnumMap() {
    enumMap = new HashMap<>();
    enumMap.put("前端获取枚举map的key", XXXEnum.getEnumMap());
    enumMap.put("前端获取枚举map的key", XXXEnum.getEnumMap());
    enumMap.put("前端获取枚举map的key", XXXEnum.getEnumMap());
    ...
    return enumMap;
}


可见,每新增一个枚举类。我们都需要在静态代码块中将映射关系放入map中。并且枚举类需要新增一个获取key和描述的映射关系方法。这样还是太麻烦了。并且后续新增映射关系还得更改这个类的代码。

能否将map初始化的步骤和枚举类创建map的步骤省略呢?

3)于是我们设想定义一个注解。使用这个注解标记的类,框架扫描这些类。并生成获取枚举key和描述的映射关系的方法。最终完成初始化Map的过程。对外只提供获取总枚举Map的方法即可。用户无需关心Map如何构建。使用这个框架之后,笔者业务系统这个接口的代码如下:

/**
 * 获取枚举
*
 * @param enumKey 枚举key
 * @return 返回值 Map<Integer,String>;code,描述
*/
@RequestMapping("/getEnum")
public Result<Map<String, Map<String, String>>> getEnum(String enumKey) {
    try {
        // 获取枚举上下文对象
        EnumContext enumContext = EnumContextFactory.getEnumContext();
        // 获取枚举map
        newEnumMap = enumContext.getEnumIndexMap();
        // buid映射从ducc中获取,所以需要手动设置
        newEnumMap.put(BUID.getKey(), getBuIdMap());
    } catch (Exception e) {
        log.error("获取枚举map出错!enumKey:{}", enumKey, e);
        return Result.createFail(e.getMessage());
    }
    // 如果枚举key为空则返回全部
    if (StringUtils.isBlank(enumKey)) {
        return Result.createWithSuc(newEnumMap);
    }
    // 如果枚举key不为空则返回指定值
    Map<String, Map<String, String>> resultMap = new HashMap<>();
    resultMap.put(enumKey, newEnumMap.get(enumKey));
    return Result.createWithSuc(resultMap);
}


4)注解类代码如下:

在这举个测试枚举类的例子

@EnumInfo(name = "StatusEnum", key = "code", desc = "description")
public enum StatusEnum {
    SUCCESS(200, "Success"),
    ERROR(500, "Error");

    private final int code;
    private final String description;

    StatusEnum(int code, String description) {
        this.code = code;
        this.description = description;
    }

    public int getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }
}


以后新增一个枚举类只需要标记@EnumInfo(name = "StatusEnum", key = "code", desc = "description")。将枚举类的name ,key字段名称和描述字段名称指定即可。无需修改接口的代码即可给前端返回该枚举的key和描述的映射关系。极大的减少了研发联调时间及测试回归时间。

框架性能压测

框架应用到实际生产项目中,需要对ChatGPT辅助编写的框架进行充分的测试验证。同时也要对框架的性能进行测试,知道框架的瓶颈。常见的接口压测工具有LoadRunner和Apache JMeter等。任选一种压测工具进行压测即可。

笔者将框架应用到项目中对外暴露了一个接口,该接口在4C4G机器配置下,单机最高可支持1000QPS,在1000QPS下,单机CPU使用率达到30%,系统负载接近0.9,内存使用率与压测前无明显变化。

作者:京东零售 王凤玺

来源:京东云开发者社区 转载请注明来源

与解放双手!ChatGPT助力编写JAVA框架相似的内容:

解放双手!ChatGPT助力编写JAVA框架

亲爱的Javaer们,在平时编码的过程中,你是否曾想过编写一个Java框架去为开发提效?但是要么编写框架时感觉无从下手,不知道从哪开始。要么有思路了后对某个功能实现的技术细节不了解,空有想法而无法实现。如果你遇到了这些问题,看完这篇文章你也能用ChatGPT编写一个简单的JAVA框架。

顺应潮流,解放双手,让ChatGPT不废话直接帮忙编写可融入业务可运行的程序代码(Python3.10实现)

众所周知,ChatGPT可以帮助研发人员编写或者Debug程序代码,但是在执行过程中,ChatGPT会将程序代码的一些相关文字解释和代码段混合着返回,如此,研发人员还需要自己进行编辑和粘贴操作,效率上差强人意,本次我们试图将ChatGPT直接嵌入到代码业务中,让ChatGPT生成可以直接运行的代码。

一款能“干掉” ChatGPT 的应用「GitHub 热点速览」

据说有了它,ChatGPT 就可以靠边站了。因为 Auto-GPT 能更加主动地完成你给他的指定任务,不用做更多的人为干涉,它的推理能力比 ChatGPT 更强,有人用它解放双手做了个 React 网站。当然除了升级的 Auto-GPT 之外,还有 DeepSpeed,它能极大地降低训练成本。这两个

【AIGC】只要10秒,AI生成IP海报,解放双手!!!

众所周知,各大厂目前都在AIGC的领域探索实践,也有非常多的外部设计师制作了大量的AIGC相关授课,很多同学因为不清楚具体能得到什么价值或者收获而停止了脚步。今天我来为大家分享一下经过实际探索且落地的Stable diffusion的IP海报生成流程,内容很干请上车坐稳

自己动手2小时学会配置游戏辅助

在工作、生活和娱乐中,我们经常遇到一些重复性的鼠标点击操作,我们可能会首先想到使用按键精灵类软件来解放双手,但是它们的使用门槛比较高,还要专门学一门脚本语言。本文介绍的软件完全不需要编程和脚本开发经验,看完就能配置出自己想要的辅助类脚本

csapp-attacklab(完美解决版)

注意:必须阅读Writeup,否则根本看不懂这个lab要怎么做 实验前准备 1.在终端中输入./ctarget和./rtarget结果报错 百度后得知自学的同学需要在执行文件时加上-q参数,不发送结果到评分服务器。后来发现官网已经说明了针对self-study student需要使用"-q" opt

STM32WB55 BLE双核flash擦写程序深度解析

简介 STM32WB55的flash擦除有两种机制,一种是只有单核运行下的flash擦除,这种模式下,flash擦除的步骤同其他STM32的flash擦除一样,直接调用HAL库中flash擦除的库函数即可;另一种是双核运行下的flash擦除,这种模式下,因为两颗CPU内核都会访问地址总线,可能会有访

长连接Netty服务内存泄漏,看我如何一步步捉“虫”解决

事情要回顾到双11.11备战前夕,在那个风雨交加的夜晚,一个急促的咚咚报警,惊破了电闪雷鸣的黑夜,将沉浸在梦香,熟睡的我惊醒。

LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,欢迎来到小彭的 LeetCode 周赛解题报告。 昨晚是 LeetCode 双周赛第 102 场,你参加了吗?这场比赛比较简单,拼的是板子手速,继上周掉大分后算是回了一口血 😁。 2618. 查询网

xftp 7必须更新最新版本怎么解决

下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找“0f88 8300”字段, 大概在864行,将88修改成83, 修改完“0f83 8300”,保存后关闭,再打开Xftp