在Reserved words as variable or method names,除了“你为什么要这样做”之外,这个问题一度被问到没有令人满意的答案。我将再次提出这个问题,并提供解释为什么有必要的背景,甚至是正确解决方案的方向。
我正在编写动态构建类的代码,以匹配数据库的模式,我无法控制。在大多数情况下,代码工作正常,但在大约0.1%的列案例中,Java中的保留字被用作列名。以下代码用于在类中创建动态字段:
evalClass.addField(CtField.make(“public”+ columnType +“”+ columnName +“;”,evalClass));
现在,使用Java语言,这会产生一个问题,但是在JVM字节代码中,这应该是完全合法的,因此应该有一种方法来动态创建此字段并使用字节码操作访问它。有没有人有任何关于如何以支持任意字符串(包括空格和保留字)的方式完成此操作的示例?谢谢!
答案 0 :(得分:2)
目前尚不清楚你被困在哪一部分。任何字节码操作库都应该允许你这样做。
例如,使用ASM,您只需将字符串直接传递给visitField。跳过任何事情都没有箍。
请注意,即使在字节码级别,字段名称仍有一些限制。特别是,它们在MUTF8编码中的长度不能超过65535字节。
答案 1 :(得分:1)
您选择了不起作用的唯一方法--Javassist的源级API。您应该明白,如果使用标识符构造源代码,则标识符必须符合源代码规则。此外,使用已知的预期结构来构造必须再次解析以重构意图的源代码,是处理字节代码的最低效方式。
您可以使用Bytecode level API来克服这些限制。另外,大多数其他字节代码处理库根本没有源代码级API,所以使用它们就可以从一开始就使用字节代码级API。
那就是说,你应该重新考虑你的前提。生成的类,其字段只能通过Reflection或其他生成的代码访问,不提供任何优势,例如,从标识符到值或数组的HashMap
映射,内在地将列与位置相关联。