Java 自省:要映射的对象
我有一个 Java 对象 obj
,它具有属性 obj.attr1
、obj.attr2
等。这些属性可能通过额外的间接级别进行访问:obj.getAttr1()
、obj.getAttr2()
(如果不是公共的)。
挑战:我想要一个接受对象并返回 Map
的函数,其中键是字符串 "attr1"
、"attr2"
等,值分别是对应的对象obj.attr1
、obj.attr2
。 我想该函数将使用诸如
toMap(obj)
- 或
toMap(obj, "attr1", "attr3")
之类的内容来调用(其中attr1
code> 和attr3
是obj
属性的子集), - 或者可能是
toMap(obj, "getAttr1", "getAttr3")
如果必要的。
我对Java的内省不太了解:在Java中如何做到这一点?
现在,我对我关心的每种对象类型都有一个专门的 toMap()
实现,但它的样板代码太多了。
注意:对于那些了解Python的人,我想要像obj.__dict__
这样的东西。或者 dict((attr, obj.__getattribute__(attr)) for attr in attr_list)
作为子集变体。
I have a Java object obj
that has attributes obj.attr1
, obj.attr2
etc. The attributes are possibly accessed through an extra level of indirection: obj.getAttr1()
, obj.getAttr2()
, if not public.
The challenge: I want a function that takes an object, and returns a Map<String, Object>
, where the keys are strings "attr1"
, "attr2"
etc. and values are the corresponding objects obj.attr1
, obj.attr2
.
I imagine the function would be invoked with something like
toMap(obj)
,- or
toMap(obj, "attr1", "attr3")
(whereattr1
andattr3
are a subset ofobj
's attributes), - or perhaps
toMap(obj, "getAttr1", "getAttr3")
if necessary.
I don't know much about Java's introspection: how do you do that in Java?
Right now, I have a specialized toMap()
implementation for each object type that I care about, and it's too much boilerplate.
NOTE: for those who know Python, I want something like obj.__dict__
. Or dict((attr, obj.__getattribute__(attr)) for attr in attr_list)
for the subset variant.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
使用
JacksonObjectMapper 的另一种方法
是convertValue
例如:Another way to user
JacksonObjectMapper
is theconvertValue
ex:使用 Apache Commons BeanUtils:http://commons.apache.org/beanutils/。
Map for JavaBeans 的实现,它使用内省来获取和放置 bean 中的属性:
注意:尽管 API 返回
Map
(自 1.9.0 起),但实际的类返回的映射中的键是java.lang.String
Use Apache Commons BeanUtils: http://commons.apache.org/beanutils/.
An implementation of Map for JavaBeans which uses introspection to get and put properties in the bean:
Note: despite the fact the API returns
Map<Object, Object>
(since 1.9.0), the actual class for keys in the returned map isjava.lang.String
为此,您可以使用 JavaBeans 自省。阅读
java.beans.Introspector
类:重要警告:我的代码仅处理getter方法;它不会找到裸露的田地。对于字段,请参阅高度咖啡因的答案。 :-)(您可能想要结合这两种方法。)
You can use JavaBeans introspection for this. Read up on the
java.beans.Introspector
class:Big caveat: My code deals with getter methods only; it will not find naked fields. For fields, see highlycaffeinated's answer. :-) (You will probably want to combine the two approaches.)
这是一个粗略的近似值,希望足以为您指明正确的方向:
Here's a rough approximation, hopefully enough to get you pointed in the right direction:
这是一个非常简单的方法来做到这一点。
使用 Jackson JSON lib 将对象转换为 JSON。
然后读取 JSON 并将其转换为 Map。
地图将包含您想要的一切。
这是 4 行
,当然,额外的好处是这是递归的,如果需要的话,会创建地图的地图
Here is a really easy way to do this.
Use Jackson JSON lib to convert the object to JSON.
Then read the JSON and convert it to a Map.
The map will contain everything you want.
Here is the 4 liner
And additional win of course is that this is recursive and will create maps of maps if it needs to
这些都不适用于嵌套属性,对象映射器做得很不错,除了您必须在映射中设置您想要在映射中看到的所有字段上的所有值,即使如此,您也无法在 ObjectMapper 中轻松避免/忽略对象拥有的 @Json 注释,基本上会跳过一些的属性。所以不幸的是,你必须做如下的事情,这只是一个草稿,只是提供一个想法。
None of these work for nested properties, object mapper does a fair job except that you have to set all values on all fields you want to see in map and even then you cannot avoid/ignore objects own @Json annotations easily in ObjectMapper basically skip some of the properties. So unfortunately, you have to do something like the following, it is only a draft to just give an idea.
maven依赖项
....
对于JSR310新的日期/时间API,有一些问题需要改进
例如:
期望(伪代码):
相反,我得到了这些:
经过一些研究,找到了一个有效的技巧,
输出:
我在 MyBatis 中使用了上面的代码进行动态查询
例如。
maven dependencies
....
for JSR310 New Date/Time API,there are some issue need to be improved
eg:
expects(pseudo-code):
instead,i got these:
after a few research,an effective trick was found,
output:
I used the above code for dynamical query in MyBatis
eg.