我有一个要实例化的Java类。

PackageGenerator gen = [
      fileName: "file.xml",
      platform: "windows",
      version: "1.0"]
println ReflectionToStringBuilder.toString(gen);

生产:
PackageGenerator_groovyProxy[fileName=<null>, platform=<null>, version=<null>]

但是如果我用.with方式编写它:
PackageGenerator gen = new PackageGenerator()
gen.with {
    fileName = "file.xml"
    platform = "windows"
    version = "1.0"
}
println ReflectionToStringBuilder.toString(gen);

产生:
PackageGenerator[fileName="file.xml", platform="windows", version="1.0"]

是什么导致使用Groovy代理类而不是实际类?

最佳答案

如果无法将原始对象分配给所需的类型,则在创建_groovyProxy实现时会添加Proxy后缀。我相信这里发生的是

PackageGenerator gen = [
  fileName: "file.xml",
  platform: "windows",
  version: "1.0"]

是相同的
PackageGenerator gen = [
  fileName: "file.xml",
  platform: "windows",
  version: "1.0"] as PackageGenerator

并且由于Map无法转换为PackageGenerator,因此会生成代理。

您可以使用地图构造函数轻松解决此问题
PackageGenerator gen = new PackageGenerator(
  fileName: "file.xml",
  platform: "windows",
  version: "1.0")

哪种实现与您在第二个示例中编写的非常接近

10-05 19:08