在运行时创建 Pojo,并在将 pojo 保存到磁盘后抛出错误 class pruned?

Create Pojo at runtime and after saving pojo on to the disk throwing an error as class pruned?

参考以下link,我在运行时创建了classes,http://blog.javaforge.net/post/31913732423/howto-create-java-pojo-at-runtime-with-javassist.I之前或对使用了cc.writeFile("//path")在您调用 cc.toClass() 之后,class 已存储在指定的位置。 但在 cc.writeFile().

后抛出如下错误无法继续

线程中出现异常 "main" java.lang.RuntimeException:toBytecode():EmployeeEntity 已被 p运行ed。

当查看 the source code 时,问题似乎是由于 wasChangedpruned 都是 true.

实际上,自动修剪应该默认关闭,至少在最近的版本中是这样。但是如果 class 文件已经被修剪过,它应该不允许后续修改。这导致得出结论,您不能在中间修改 CtClass 对象,因此错误不在您这边。在文件中搜索出现的 wasChanged 会发现忘记将其设置为 false.

所以发生的事情是

  • 你设置了建设中的class,将wasChanged变为true
  • 您调用 toClass(),后者又调用 toBytecode,后者会将 prunedfrozen 设置为 true,不允许进一步修改,但忘记了将 wasChanged 设置为 false.
  • 你调用 writeFile,它也会调用 toBytecode,它现在检测到文件已被修改,根据它永不重置的标志,并抛出异常,作为 class 已被修剪。

如果交换 toClass()writeFile,逻辑保持不变,因为两者都在内部调用 toBytecode,不能调用两次,给定上述行为。

您有多种选择。

  • 您可以在 调用 toClass() 之前调用 debugWriteFile​(path) ,因为 debugWriteFile 被记录为“不修剪或冻结” class 写入 class 文件后。

  • 您可以在调用writeFiletoClass之前调用stopPruning(true)。如上所述,默认情况下修剪应该是均匀的。

  • 您可以自己直接调用toBytecode(),并且只调用一次。然后……

    这可能有点复杂,但由于只构建一次 class 文件字节,因此它是最有效的解决方案。