You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CodeModel生成带十六进制常量的Java枚举?

解决CodeModel生成Java枚举时十六进制int参数的问题

你遇到的问题根源很明确:JExpr.lit(String s)会生成带双引号的字符串字面量,而你需要的是无引号的十六进制整数常量。这里有两种解决方案,取决于你是否需要严格保留代码中十六进制的写法(比如0x00而非0):

方案1:解析十六进制字符串为int值(功能等价,生成十进制常量)

如果只是需要功能正确的int参数(Java编译时十进制和十六进制int完全等价),可以先把输入的"0x00"这类字符串解析成int值,再用JExpr.lit(int)生成常量:

final String[] rawTextDataParts = rawTextDataLine.split(",");
// 清理输入空格,解析十六进制字符串为int
int first = Integer.parseInt(rawTextDataParts[0].trim().replace("0x", ""), 16);
int second = Integer.parseInt(rawTextDataParts[1].trim().replace("0x", ""), 16);

JEnumConstant enumConst = jDefinedClass.enumConstant(generateEnumConstantName(rawTextDataParts[2]));
// 使用int类型的字面量生成方法
enumConst.arg(JExpr.lit(first));
enumConst.arg(JExpr.lit(second));

这种方式生成的代码中,参数会是十进制形式(比如0、1),但运行时和十六进制写法完全一致。

方案2:直接插入十六进制字面量(严格保留0x格式)

如果你需要生成的代码严格保持0x00、0x0000这样的写法,可以使用JExpr.direct()方法——它会直接将传入的字符串作为代码片段插入,不会添加引号:

final String[] rawTextDataParts = rawTextDataLine.split(",");
// 直接提取并清理十六进制字符串(去掉多余空格)
String firstHex = rawTextDataParts[0].trim();
String secondHex = rawTextDataParts[1].trim();

JEnumConstant enumConst = jDefinedClass.enumConstant(generateEnumConstantName(rawTextDataParts[2]));
// 直接插入原始十六进制字面量
enumConst.arg(JExpr.direct(firstHex));
enumConst.arg(JExpr.direct(secondHex));

这个方案会完全按照你期望的格式生成枚举参数,和你给出的目标代码完全一致。

额外注意

  • 记得用trim()处理输入字符串中的空格,避免解析错误或生成多余空白字符;
  • 你的输入数据格式是0x00, 0x0000, VALUE_0000,所以枚举名称对应的是rawTextDataParts[2],之前代码中的rawTextDataParts[4]应该是输入格式变化导致的,需要调整索引。

内容的提问来源于stack exchange,提问作者Hector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:24