java美元符号com.package.Foo。$$$。酒吧问题

时间:2017-12-15 14:43:25

标签: java reflection

我正在进行webservice调用,并使用名为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

1 个答案:

答案 0 :(得分:1)

这通常是一些包使用自动生成的代码来隐藏其实现的库。使用Hibernate时可以捕获另一个实例(略有不同),Hibernate依赖于Proxy包中的com.sun.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