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



这个问题曾经在保留字作为变量名或方法名时被问到,除了"为什么要这样做"之外,没有一个令人满意的答案。我要再问一遍,并提供上下文来解释为什么它是必要的,甚至是正确解决方案的方向。

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

evalClass.addField (CtField。make("public " + columnType + " " + columnName + ";", evalClass);

现在,在Java语言中,这会导致一个问题,然而在JVM字节码中,这应该是完全合法的,所以应该有一种方法来动态创建这个字段并使用字节码操作来访问它。有人能举个例子来说明如何支持任意字符串,包括空格和保留字吗?谢谢!

不清楚你卡在哪个部位。任何字节码操作库都应该允许您这样做。

例如,使用ASM,您只需将字符串直接传递给visitField。没有任何障碍。

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

您选择了唯一不能工作的方法——javassist的源代码级API。很明显,如果您使用标识符构造源代码,那么标识符必须遵守源代码规则。此外,使用已知的意图结构来构造源代码,必须再次解析以重新构造意图,这是处理字节码的最低效的方式。

您可以使用字节码级API来克服这些限制。作为旁注,大多数其他字节码处理库根本没有源代码级API,因此使用它们,您将从一开始就使用字节码级API。

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

相关内容

  • 没有找到相关文章

最新更新