使用保留字作为变量创建动态类

时间:2016-09-11 17:29:03

标签: java reflection bytecode javassist

Reserved words as variable or method names,除了“你为什么要这样做”之外,这个问题一度被问到没有令人满意的答案。我将再次提出这个问题,并提供解释为什么有必要的背景,甚至是正确解决方案的方向。

我正在编写动态构建类的代码,以匹配数据库的模式,我无法控制。在大多数情况下,代码工作正常,但在大约0.1%的列案例中,Java中的保留字被用作列名。以下代码用于在类中创建动态字段:

evalClass.addField(CtField.make(“public”+ columnType +“”+ columnName +“;”,evalClass));

现在,使用Java语言,这会产生一个问题,但是在JVM字节代码中,这应该是完全合法的,因此应该有一种方法来动态创建此字段并使用字节码操作访问它。有没有人有任何关于如何以支持任意字符串(包括空格和保留字)的方式完成此操作的示例?谢谢!

2 个答案:

答案 0 :(得分:2)

目前尚不清楚你被困在哪一部分。任何字节码操作库都应该允许你这样做。

例如,使用ASM,您只需将字符串直接传递给visitField。跳过任何事情都没有箍。

请注意,即使在字节码级别,字段名称仍有一些限制。特别是,它们在MUTF8编码中的长度不能超过65535字节。

答案 1 :(得分:1)

您选择了不起作用的唯一方法--Javassist的源级API。您应该明白,如果使用标识符构造源代码,则标识符必须符合源代码规则。此外,使用已知的预期结构来构造必须再次解析以重构意图的源代码,是处理字节代码的最低效方式。

您可以使用Bytecode level API来克服这些限制。另外,大多数其他字节代码处理库根本没有源代码级API,所以使用它们就可以从一开始就使用字节代码级API。

那就是说,你应该重新考虑你的前提。生成的类,其字段只能通过Reflection或其他生成的代码访问,不提供任何优势,例如,从标识符到值或数组的HashMap映射,内在地将列与位置相关联。