Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
touzizhuo03
Dubbo
提交
93c668a7
D
Dubbo
项目概览
touzizhuo03
/
Dubbo
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Dubbo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
93c668a7
编写于
7月 18, 2012
作者:
K
kimi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
DUBBO-474 泛化实现在调用时不应改变用户原始数据
上级
17243e75
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
81 addition
and
7 deletion
+81
-7
dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/PojoUtils.java
...c/main/java/com/alibaba/dubbo/common/utils/PojoUtils.java
+55
-7
dubbo-common/src/test/java/com/alibaba/dubbo/common/utils/PojoUtilsTest.java
...st/java/com/alibaba/dubbo/common/utils/PojoUtilsTest.java
+26
-0
未找到文件。
dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/PojoUtils.java
浏览文件 @
93c668a7
...
...
@@ -27,13 +27,20 @@ import java.lang.reflect.Proxy;
import
java.lang.reflect.Type
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.Hashtable
;
import
java.util.IdentityHashMap
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Properties
;
import
java.util.TreeMap
;
import
java.util.WeakHashMap
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.ConcurrentSkipListMap
;
/**
* PojoUtils. Travel object deeply, and convert complex type to simple type.
...
...
@@ -114,7 +121,7 @@ public class PojoUtils {
}
if
(
pojo
instanceof
Class
)
{
return
((
Class
<?>
)
pojo
).
getName
();
return
((
Class
)
pojo
).
getName
();
}
Object
o
=
history
.
get
(
pojo
);
...
...
@@ -145,7 +152,7 @@ public class PojoUtils {
}
if
(
pojo
instanceof
Map
<?,
?>)
{
Map
<
Object
,
Object
>
src
=
(
Map
<
Object
,
Object
>)
pojo
;
Map
<
Object
,
Object
>
dest
=
new
HashMap
<
Object
,
Object
>(
src
.
size
()
);
Map
<
Object
,
Object
>
dest
=
createMap
(
src
);
history
.
put
(
pojo
,
dest
);
for
(
Map
.
Entry
<
Object
,
Object
>
obj
:
src
.
entrySet
())
{
dest
.
put
(
generalize
(
obj
.
getKey
(),
history
),
generalize
(
obj
.
getValue
(),
history
));
...
...
@@ -174,7 +181,7 @@ public class PojoUtils {
if
(
history
.
containsKey
(
pojo
))
{
Object
pojoGenerilizedValue
=
history
.
get
(
pojo
);
if
(
pojoGenerilizedValue
instanceof
Map
&&
((
Map
<?,
?>
)
pojoGenerilizedValue
).
containsKey
(
field
.
getName
()))
{
&&
((
Map
)
pojoGenerilizedValue
).
containsKey
(
field
.
getName
()))
{
continue
;
}
}
...
...
@@ -244,6 +251,47 @@ public class PojoUtils {
return
new
ArrayList
<
Object
>();
}
private
static
Map
createMap
(
Map
src
)
{
Class
<?
extends
Map
>
cl
=
src
.
getClass
();
Map
result
=
null
;
if
(
HashMap
.
class
==
cl
)
{
result
=
new
HashMap
();
}
else
if
(
Hashtable
.
class
==
cl
)
{
result
=
new
Hashtable
();
}
else
if
(
IdentityHashMap
.
class
==
cl
)
{
result
=
new
IdentityHashMap
();
}
else
if
(
LinkedHashMap
.
class
==
cl
)
{
result
=
new
LinkedHashMap
();
}
else
if
(
Properties
.
class
==
cl
)
{
result
=
new
Properties
();
}
else
if
(
TreeMap
.
class
==
cl
)
{
result
=
new
TreeMap
();
}
else
if
(
WeakHashMap
.
class
==
cl
)
{
return
new
WeakHashMap
();
}
else
if
(
ConcurrentHashMap
.
class
==
cl
)
{
result
=
new
ConcurrentHashMap
();
}
else
if
(
ConcurrentSkipListMap
.
class
==
cl
)
{
result
=
new
ConcurrentSkipListMap
();
}
else
{
try
{
result
=
cl
.
newInstance
();
}
catch
(
Exception
e
)
{
/* ignore */
}
if
(
result
==
null
)
{
try
{
Constructor
<?>
constructor
=
cl
.
getConstructor
(
Map
.
class
);
result
=
(
Map
)
constructor
.
newInstance
(
Collections
.
EMPTY_MAP
);
}
catch
(
Exception
e
)
{
/* ignore */
}
}
}
if
(
result
==
null
)
{
result
=
new
HashMap
<
Object
,
Object
>();
}
return
result
;
}
@SuppressWarnings
({
"unchecked"
,
"rawtypes"
})
private
static
Object
realize0
(
Object
pojo
,
Class
<?>
type
,
Type
genericType
,
final
Map
<
Object
,
Object
>
history
)
{
if
(
pojo
==
null
)
{
...
...
@@ -352,8 +400,8 @@ public class PojoUtils {
}
if
(
Map
.
class
.
isAssignableFrom
(
type
)
||
type
==
Object
.
class
)
{
final
Map
<
Object
,
Object
>
dest
=
new
HashMap
<
Object
,
Object
>(
map
.
size
()
);
history
.
put
(
pojo
,
des
t
);
final
Map
<
Object
,
Object
>
result
=
createMap
(
map
);
history
.
put
(
pojo
,
resul
t
);
for
(
Map
.
Entry
<
Object
,
Object
>
entry
:
map
.
entrySet
())
{
Type
keyType
=
getGenericClassByIndex
(
genericType
,
0
);
Type
valueType
=
getGenericClassByIndex
(
genericType
,
1
);
...
...
@@ -372,9 +420,9 @@ public class PojoUtils {
Object
key
=
keyClazz
==
null
?
entry
.
getKey
()
:
realize0
(
entry
.
getKey
(),
keyClazz
,
keyType
,
history
);
Object
value
=
valueClazz
==
null
?
entry
.
getValue
()
:
realize0
(
entry
.
getValue
(),
valueClazz
,
valueType
,
history
);
des
t
.
put
(
key
,
value
);
resul
t
.
put
(
key
,
value
);
}
return
des
t
;
return
resul
t
;
}
else
if
(
type
.
isInterface
())
{
Object
dest
=
Proxy
.
newProxyInstance
(
Thread
.
currentThread
().
getContextClassLoader
(),
new
Class
<?>[]{
type
},
new
PojoInvocationHandler
(
map
));
history
.
put
(
pojo
,
dest
);
...
...
dubbo-common/src/test/java/com/alibaba/dubbo/common/utils/PojoUtilsTest.java
浏览文件 @
93c668a7
...
...
@@ -27,6 +27,8 @@ import java.util.ArrayList;
import
java.util.Arrays
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.LinkedHashMap
;
import
java.util.LinkedList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.UUID
;
...
...
@@ -588,6 +590,30 @@ public class PojoUtilsTest {
Assert
.
assertEquals
(
data
.
getList
().
get
(
0
).
getAge
(),
realizadData
.
getList
().
get
(
0
).
getAge
());
}
@Test
public
void
testRealize
()
throws
Exception
{
Map
<
String
,
String
>
inputMap
=
new
LinkedHashMap
<
String
,
String
>();
inputMap
.
put
(
"key"
,
"value"
);
Object
obj
=
PojoUtils
.
generalize
(
inputMap
);
Assert
.
assertTrue
(
obj
instanceof
LinkedHashMap
);
Object
outputObject
=
PojoUtils
.
realize
(
inputMap
,
LinkedHashMap
.
class
);
System
.
out
.
println
(
outputObject
.
getClass
().
getName
());
Assert
.
assertTrue
(
outputObject
instanceof
LinkedHashMap
);
}
@Test
public
void
testRealizeLinkedList
()
throws
Exception
{
LinkedList
<
Person
>
input
=
new
LinkedList
<
Person
>();
Person
person
=
new
Person
();
person
.
setAge
(
37
);
input
.
add
(
person
);
Object
obj
=
PojoUtils
.
generalize
(
input
);
Assert
.
assertTrue
(
obj
instanceof
List
);
Assert
.
assertTrue
(
input
.
get
(
0
)
instanceof
Person
);
Object
output
=
PojoUtils
.
realize
(
obj
,
LinkedList
.
class
);
Assert
.
assertTrue
(
output
instanceof
LinkedList
);
}
private
static
Child
newChild
(
String
name
,
int
age
)
{
Child
result
=
new
Child
();
result
.
setName
(
name
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录