我正在进行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
?
答案 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