【问题标题】:java dollar symbol com.package.Foo.$$$.Bar issuejava美元符号com.package.Foo.$$$.Bar问题
【发布时间】:2017-12-15 14:43:24
【问题描述】:

我正在做一个 Web 服务调用,它以名为 Foo 的模型类进行响应。 Foo 没有扩展任何其他类。

Foo data = call(); 

我可以正常访问所有数据字段。 String str = data.getData();

但是,如果我这样做 System.out.println(data.toString()); 我得到以下输出:com.package.Foo.$$$.Bar@2938ac9a

我怀疑 Web 框架正在围绕响应做一些反射魔术,并用代理类包装它。由于Bar 在应用程序级别扩展Foo,所以我什么都看不到,但仍然可以访问我需要的所有数据。但是……

问题:

当我尝试序列化 Foo 数据时;结果我得到了很多意想不到的数据和字段。

我想知道是否有人可以解释一下$$$ 在 java 中的含义以及如何将Bar 对象转换回Foo

【问题讨论】:

  • 我相信这只是一个自动生成的类名。
  • 关于如何将 Bar 转换为 Foo 的任何想法?
  • 除非你的Foo 类有一个复制构造函数,我不认为有一个简单的方法。你在做什么导致问题的序列化?

标签: java reflection


【解决方案1】:

这通常是一些库用来隐藏其实现的包装器,带有自动生成的代码。使用 Hibernate 时可以捕获另一个实例(略有不同),它依赖于 com.sun.proxy 包中的 Proxy 类:

...
at com.sun.proxy.$Proxy38.getSingleResult(Unknown Source) // Who would name its class 'Proxy38' ?
...

更多详情请见this other SO answer

您必须编写自己的包装器才能成功:

public Foo barToFoo(Bar data)    {
    Foo foo = new Foo();
    foo.name = data.getName();
    ...
    ...
    return foo;
}

这是您最安全的选择之一。你可以控制数据,你仍然可以访问它,你正在将它转换回Foo,以想要的方式(而不是一些棘手的转换或隐藏实现),你可以处理任何情况你喜欢(null 数据、异常等)。

编辑

它应该自动发生。有什么解决方案[...]?

不幸的是,看起来没有。 There is an overloading solution in C++, but not in Java.

【讨论】:

  • 感谢您的回答,这应该可以,但唯一的问题是转换应该自动发生。你知道是否有任何可用的解决方案?给定对象和目标类型,他们会自动将其转换为 getter 和 setter 使用相同的名称?
  • (Foo) data.toString() 不会编译。
  • 此外,C++ 中没有自动化解决方案 - 您链接到的答案实际上只是说您可以将代码隐藏在重载的转换运算符中。
  • 好吧,因为这是关于自动化问题的最佳答案,我认为将其链接起来很有用。我会说清楚的,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2012-03-13
  • 2010-12-14
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多