如何用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
相关产品推荐
相关产品推荐

