Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
7bf609f1
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
GitCode(gitcode.net)2024年7月9日维护升级公告
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
7bf609f1
编写于
5月 23, 2015
作者:
S
Sam Brannen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement equals() for synthesized annotations
Issue: SPR-13065
上级
c622f4c4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
71 addition
and
10 deletion
+71
-10
spring-core/src/main/java/org/springframework/core/annotation/SynthesizedAnnotationInvocationHandler.java
...re/annotation/SynthesizedAnnotationInvocationHandler.java
+33
-10
spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java
...springframework/core/annotation/AnnotationUtilsTests.java
+38
-0
未找到文件。
spring-core/src/main/java/org/springframework/core/annotation/SynthesizedAnnotationInvocationHandler.java
浏览文件 @
7bf609f1
...
...
@@ -21,13 +21,14 @@ import java.lang.reflect.AnnotatedElement;
import
java.lang.reflect.InvocationHandler
;
import
java.lang.reflect.Method
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.ReflectionUtils
;
import
org.springframework.util.StringUtils
;
import
static
org
.
springframework
.
core
.
annotation
.
AnnotationUtils
.*;
/**
* {@link InvocationHandler} for an {@link Annotation} that Spring has
* <em>synthesized</em> (i.e., wrapped in a dynamic proxy) with additional
...
...
@@ -56,7 +57,7 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
private
final
Map
<
String
,
String
>
aliasMap
;
public
SynthesizedAnnotationInvocationHandler
(
AnnotatedElement
annotatedElement
,
Annotation
annotation
,
SynthesizedAnnotationInvocationHandler
(
AnnotatedElement
annotatedElement
,
Annotation
annotation
,
Map
<
String
,
String
>
aliasMap
)
{
this
.
annotatedElement
=
annotatedElement
;
this
.
annotation
=
annotation
;
...
...
@@ -70,7 +71,10 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
Class
<?>[]
parameterTypes
=
method
.
getParameterTypes
();
int
parameterCount
=
parameterTypes
.
length
;
if
(
"toString"
.
equals
(
methodName
)
&&
(
parameterCount
==
0
))
{
if
(
"equals"
.
equals
(
methodName
)
&&
(
parameterCount
==
1
)
&&
(
parameterTypes
[
0
]
==
Object
.
class
))
{
return
equals
(
proxy
,
args
[
0
]);
}
else
if
(
"toString"
.
equals
(
methodName
)
&&
(
parameterCount
==
0
))
{
return
toString
(
proxy
);
}
...
...
@@ -82,7 +86,7 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
ReflectionUtils
.
makeAccessible
(
method
);
Object
value
=
ReflectionUtils
.
invokeMethod
(
method
,
this
.
annotation
,
args
);
// No
thing special to do
?
// No
custom processing necessary
?
if
(!
aliasPresent
&&
!
nestedAnnotation
)
{
return
value
;
}
...
...
@@ -101,11 +105,12 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
ReflectionUtils
.
makeAccessible
(
aliasedMethod
);
Object
aliasedValue
=
ReflectionUtils
.
invokeMethod
(
aliasedMethod
,
this
.
annotation
,
args
);
Object
defaultValue
=
AnnotationUtils
.
getDefaultValue
(
this
.
annotation
,
methodName
);
Object
defaultValue
=
getDefaultValue
(
this
.
annotation
,
methodName
);
if
(!
ObjectUtils
.
nullSafeEquals
(
value
,
aliasedValue
)
&&
!
ObjectUtils
.
nullSafeEquals
(
value
,
defaultValue
)
&&
!
ObjectUtils
.
nullSafeEquals
(
aliasedValue
,
defaultValue
))
{
String
elementName
=
(
this
.
annotatedElement
==
null
?
"unknown element"
:
this
.
annotatedElement
.
toString
());
String
elementName
=
(
this
.
annotatedElement
==
null
?
"unknown element"
:
this
.
annotatedElement
.
toString
());
String
msg
=
String
.
format
(
"In annotation [%s] declared on [%s], attribute [%s] and its alias [%s] are "
+
"declared with values of [%s] and [%s], but only one declaration is permitted."
,
...
...
@@ -123,23 +128,41 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
// Synthesize nested annotations before returning them.
if
(
value
instanceof
Annotation
)
{
value
=
AnnotationUtils
.
synthesizeAnnotation
((
Annotation
)
value
,
this
.
annotatedElement
);
value
=
synthesizeAnnotation
((
Annotation
)
value
,
this
.
annotatedElement
);
}
else
if
(
value
instanceof
Annotation
[])
{
Annotation
[]
annotations
=
(
Annotation
[])
value
;
for
(
int
i
=
0
;
i
<
annotations
.
length
;
i
++)
{
annotations
[
i
]
=
AnnotationUtils
.
synthesizeAnnotation
(
annotations
[
i
],
this
.
annotatedElement
);
annotations
[
i
]
=
synthesizeAnnotation
(
annotations
[
i
],
this
.
annotatedElement
);
}
}
return
value
;
}
private
boolean
equals
(
Object
proxy
,
Object
other
)
{
if
(
this
==
other
)
{
return
true
;
}
if
(!
this
.
annotationType
.
isInstance
(
other
))
{
return
false
;
}
for
(
Method
attributeMethod
:
getAttributeMethods
(
this
.
annotationType
))
{
Object
thisValue
=
ReflectionUtils
.
invokeMethod
(
attributeMethod
,
proxy
);
Object
otherValue
=
ReflectionUtils
.
invokeMethod
(
attributeMethod
,
other
);
if
(!
ObjectUtils
.
nullSafeEquals
(
thisValue
,
otherValue
))
{
return
false
;
}
}
return
true
;
}
private
String
toString
(
Object
proxy
)
{
StringBuilder
sb
=
new
StringBuilder
(
"@"
).
append
(
annotationType
.
getName
()).
append
(
"("
);
List
<
Method
>
attributeMethods
=
AnnotationUtils
.
getAttributeMethods
(
this
.
annotationType
);
Iterator
<
Method
>
iterator
=
attributeMethods
.
iterator
();
Iterator
<
Method
>
iterator
=
getAttributeMethods
(
this
.
annotationType
).
iterator
();
while
(
iterator
.
hasNext
())
{
Method
attributeMethod
=
iterator
.
next
();
sb
.
append
(
attributeMethod
.
getName
());
...
...
spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java
浏览文件 @
7bf609f1
...
...
@@ -656,6 +656,44 @@ public class AnnotationUtilsTests {
assertThat
(
string
,
endsWith
(
")"
));
}
@Test
public
void
equalsForSynthesizedAnnotations
()
throws
Exception
{
Method
methodWithPath
=
WebController
.
class
.
getMethod
(
"handleMappedWithPathAttribute"
);
WebMapping
webMappingWithAliases
=
methodWithPath
.
getAnnotation
(
WebMapping
.
class
);
assertNotNull
(
webMappingWithAliases
);
Method
methodWithPathAndValue
=
WebController
.
class
.
getMethod
(
"handleMappedWithSamePathAndValueAttributes"
);
WebMapping
webMappingWithPathAndValue
=
methodWithPathAndValue
.
getAnnotation
(
WebMapping
.
class
);
assertNotNull
(
webMappingWithPathAndValue
);
WebMapping
synthesizedWebMapping1
=
synthesizeAnnotation
(
webMappingWithAliases
);
assertNotNull
(
synthesizedWebMapping1
);
WebMapping
synthesizedWebMapping2
=
synthesizeAnnotation
(
webMappingWithAliases
);
assertNotNull
(
synthesizedWebMapping2
);
// Equality amongst standard annotations
assertThat
(
webMappingWithAliases
,
is
(
webMappingWithAliases
));
assertThat
(
webMappingWithPathAndValue
,
is
(
webMappingWithPathAndValue
));
// Inequality amongst standard annotations
assertThat
(
webMappingWithAliases
,
is
(
not
(
webMappingWithPathAndValue
)));
assertThat
(
webMappingWithPathAndValue
,
is
(
not
(
webMappingWithAliases
)));
// Equality amongst synthesized annotations
assertThat
(
synthesizedWebMapping1
,
is
(
synthesizedWebMapping1
));
assertThat
(
synthesizedWebMapping2
,
is
(
synthesizedWebMapping2
));
assertThat
(
synthesizedWebMapping1
,
is
(
synthesizedWebMapping2
));
assertThat
(
synthesizedWebMapping2
,
is
(
synthesizedWebMapping1
));
// Equality between standard and synthesized annotations
assertThat
(
synthesizedWebMapping1
,
is
(
webMappingWithPathAndValue
));
assertThat
(
webMappingWithPathAndValue
,
is
(
synthesizedWebMapping1
));
// Inequality between standard and synthesized annotations
assertThat
(
synthesizedWebMapping1
,
is
(
not
(
webMappingWithAliases
)));
assertThat
(
webMappingWithAliases
,
is
(
not
(
synthesizedWebMapping1
)));
}
/**
* Fully reflection-based test that verifies support for
* {@linkplain AnnotationUtils#synthesizeAnnotation synthesizing annotations}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录