Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
53d01392
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,发现更多精彩内容 >>
提交
53d01392
编写于
3月 29, 2018
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Workaround for inner class constructor parameter annotation bug in javac
Issue: SPR-16652
上级
3ac46da2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
30 addition
and
12 deletion
+30
-12
spring-core/src/main/java/org/springframework/core/MethodParameter.java
...c/main/java/org/springframework/core/MethodParameter.java
+16
-4
spring-core/src/test/java/org/springframework/core/MethodParameterTests.java
...t/java/org/springframework/core/MethodParameterTests.java
+14
-8
未找到文件。
spring-core/src/main/java/org/springframework/core/MethodParameter.java
浏览文件 @
53d01392
/*
* Copyright 2002-201
7
the original author or authors.
* Copyright 2002-201
8
the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -22,6 +22,7 @@ import java.lang.reflect.Constructor;
import
java.lang.reflect.Executable
;
import
java.lang.reflect.Member
;
import
java.lang.reflect.Method
;
import
java.lang.reflect.Modifier
;
import
java.lang.reflect.Parameter
;
import
java.lang.reflect.ParameterizedType
;
import
java.lang.reflect.Type
;
...
...
@@ -57,6 +58,8 @@ import org.springframework.util.Assert;
*/
public
class
MethodParameter
{
private
static
final
Annotation
[]
EMPTY_ANNOTATION_ARRAY
=
new
Annotation
[
0
];
private
final
Executable
executable
;
private
final
int
parameterIndex
;
...
...
@@ -514,11 +517,20 @@ public class MethodParameter {
Annotation
[]
paramAnns
=
this
.
parameterAnnotations
;
if
(
paramAnns
==
null
)
{
Annotation
[][]
annotationArray
=
this
.
executable
.
getParameterAnnotations
();
if
(
this
.
parameterIndex
>=
0
&&
this
.
parameterIndex
<
annotationArray
.
length
)
{
paramAnns
=
adaptAnnotationArray
(
annotationArray
[
this
.
parameterIndex
]);
int
index
=
this
.
parameterIndex
;
if
(
this
.
executable
instanceof
Constructor
&&
this
.
executable
.
getDeclaringClass
().
isMemberClass
()
&&
!
Modifier
.
isStatic
(
this
.
executable
.
getDeclaringClass
().
getModifiers
())
&&
annotationArray
.
length
==
this
.
executable
.
getParameterCount
()
-
1
)
{
// Bug in javac in JDK <9: annotation array excludes enclosing instance parameter
// for inner classes, so access it with the actual parameter index lowered by 1
index
=
this
.
parameterIndex
-
1
;
}
if
(
index
>=
0
&&
index
<
annotationArray
.
length
)
{
paramAnns
=
adaptAnnotationArray
(
annotationArray
[
index
]);
}
else
{
paramAnns
=
new
Annotation
[
0
]
;
paramAnns
=
EMPTY_ANNOTATION_ARRAY
;
}
this
.
parameterAnnotations
=
paramAnns
;
}
...
...
spring-core/src/test/java/org/springframework/core/MethodParameterTests.java
浏览文件 @
53d01392
...
...
@@ -24,7 +24,6 @@ import java.lang.reflect.Constructor;
import
java.lang.reflect.Method
;
import
org.junit.Before
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
static
org
.
junit
.
Assert
.*;
...
...
@@ -46,7 +45,7 @@ public class MethodParameterTests {
@Before
public
void
set
U
p
()
throws
NoSuchMethodException
{
public
void
set
u
p
()
throws
NoSuchMethodException
{
method
=
getClass
().
getMethod
(
"method"
,
String
.
class
,
Long
.
TYPE
);
stringParameter
=
new
MethodParameter
(
method
,
0
);
longParameter
=
new
MethodParameter
(
method
,
1
);
...
...
@@ -114,15 +113,22 @@ public class MethodParameterTests {
assertNotNull
(
methodParameter
.
getParameterAnnotation
(
Param
.
class
));
}
@Test
@Ignore
(
"Disabled until SPR-16652 is resolved"
)
@Test
// SPR-16652
public
void
annotatedConstructorParameterInInnerClass
()
throws
Exception
{
Constructor
<?>
constructor
=
InnerClass
.
class
.
getDeclaredConstructor
(
getClass
(),
String
.
class
);
MethodParameter
methodParameter
=
MethodParameter
.
forExecutable
(
constructor
,
1
);
Constructor
<?>
constructor
=
InnerClass
.
class
.
getConstructor
(
getClass
(),
String
.
class
,
Integer
.
class
);
MethodParameter
methodParameter
=
MethodParameter
.
forExecutable
(
constructor
,
0
);
assertEquals
(
getClass
(),
methodParameter
.
getParameterType
());
assertNull
(
methodParameter
.
getParameterAnnotation
(
Param
.
class
));
methodParameter
=
MethodParameter
.
forExecutable
(
constructor
,
1
);
assertEquals
(
String
.
class
,
methodParameter
.
getParameterType
());
assertNull
(
methodParameter
.
getParameterAnnotation
(
Override
.
class
));
// The following assertion currently fails if this test class is compiled using JDK 8.
assertNotNull
(
"Failed to find @Param annotation"
,
methodParameter
.
getParameterAnnotation
(
Param
.
class
));
methodParameter
=
MethodParameter
.
forExecutable
(
constructor
,
2
);
assertEquals
(
Integer
.
class
,
methodParameter
.
getParameterType
());
assertNull
(
methodParameter
.
getParameterAnnotation
(
Param
.
class
));
}
...
...
@@ -140,7 +146,7 @@ public class MethodParameterTests {
@SuppressWarnings
(
"unused"
)
private
class
InnerClass
{
InnerClass
(
@Param
String
s
)
{
public
InnerClass
(
@Param
String
s
,
Integer
i
)
{
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录