Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
8a271383
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8a271383
编写于
9月 18, 2014
作者:
J
jfranck
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8058632: Revert JDK-8054984 from 8u40
Reviewed-by: sla
上级
0fa7404a
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
37 addition
and
155 deletion
+37
-155
src/share/classes/java/lang/reflect/Constructor.java
src/share/classes/java/lang/reflect/Constructor.java
+5
-23
src/share/classes/java/lang/reflect/Executable.java
src/share/classes/java/lang/reflect/Executable.java
+10
-13
test/java/lang/annotation/typeAnnotations/ConstructorReceiverTest.java
...g/annotation/typeAnnotations/ConstructorReceiverTest.java
+7
-31
test/java/lang/annotation/typeAnnotations/GetAnnotatedReceiverType.java
.../annotation/typeAnnotations/GetAnnotatedReceiverType.java
+13
-88
test/java/lang/annotation/typeAnnotations/TestExecutableGetAnnotatedType.java
...ation/typeAnnotations/TestExecutableGetAnnotatedType.java
+2
-0
未找到文件。
src/share/classes/java/lang/reflect/Constructor.java
浏览文件 @
8a271383
...
...
@@ -557,33 +557,15 @@ public final class Constructor<T> extends Executable {
*/
@Override
public
AnnotatedType
getAnnotatedReceiverType
()
{
Class
<?>
thisDeclClass
=
getDeclaringClass
();
Class
<?>
enclosingClass
=
thisDeclClass
.
getEnclosingClass
();
if
(
getDeclaringClass
().
getEnclosingClass
()
==
null
)
return
super
.
getAnnotatedReceiverType
();
if
(
enclosingClass
==
null
)
{
// A Constructor for a top-level class
return
null
;
}
Class
<?>
outerDeclaringClass
=
thisDeclClass
.
getDeclaringClass
();
if
(
outerDeclaringClass
==
null
)
{
// A constructor for a local or anonymous class
return
null
;
}
// Either static nested or inner class
if
(
Modifier
.
isStatic
(
thisDeclClass
.
getModifiers
()))
{
// static nested
return
null
;
}
// A Constructor for an inner class
return
TypeAnnotationParser
.
buildAnnotatedType
(
getTypeAnnotationBytes0
(),
sun
.
misc
.
SharedSecrets
.
getJavaLangAccess
().
getConstantPool
(
thisDeclClass
),
getConstantPool
(
getDeclaringClass
()
),
this
,
thisDeclClass
,
enclosingClass
,
getDeclaringClass
()
,
getDeclaringClass
().
getEnclosingClass
()
,
TypeAnnotation
.
TypeAnnotationTarget
.
METHOD_RECEIVER
);
}
}
src/share/classes/java/lang/reflect/Executable.java
浏览文件 @
8a271383
...
...
@@ -602,24 +602,21 @@ public abstract class Executable extends AccessibleObject
/**
* Returns an {@code AnnotatedType} object that represents the use of a
* type to specify the receiver type of the method/constructor represented
* by this {@code Executable} object.
* by this Executable object. The receiver type of a method/constructor is
* available only if the method/constructor has a <em>receiver
* parameter</em> (JLS 8.4.1).
*
* The receiver type of a method/constructor is available only if the
* method/constructor has a receiver parameter (JLS 8.4.1). If this {@code
* Executable} object <em>represents an instance method or represents a
* constructor of an inner member class</em>, and the
* method/constructor <em>either</em> has no receiver parameter or has a
* receiver parameter with no annotations on its type, then the return
* value is an {@code AnnotatedType} object representing an element with no
* If this {@code Executable} object represents a constructor or instance
* method that does not have a receiver parameter, or has a receiver
* parameter with no annotations on its type, then the return value is an
* {@code AnnotatedType} object representing an element with no
* annotations.
*
* If this {@code Executable} object represents a static method or
* represents a constructor of a top level, static member, local, or
* anoymous class, then the return value is null.
* If this {@code Executable} object represents a static method, then the
* return value is null.
*
* @return an object representing the receiver type of the method or
* constructor represented by this {@code Executable} or {@code null} if
* this {@code Executable} can not have a receiver parameter
* constructor represented by this {@code Executable}
*
* @since 1.8
*/
...
...
test/java/lang/annotation/typeAnnotations/ConstructorReceiverTest.java
浏览文件 @
8a271383
...
...
@@ -23,7 +23,7 @@
/*
* @test
* @bug 8023651
8044629
* @bug 8023651
* @summary Test that the receiver annotations and the return annotations of
* constructors behave correctly.
* @run testng ConstructorReceiverTest
...
...
@@ -38,16 +38,11 @@ import org.testng.annotations.Test;
import
static
org
.
testng
.
Assert
.*;
public
class
ConstructorReceiverTest
{
public
static
final
Integer
EMPTY_ANNOTATED_TYPE
=
Integer
.
valueOf
(-
1
);
// Format is {
// { Class to get ctor for,
// ctor param class,
// value of anno of return type,
// value of anno for receiver,
// or null if there should be no receiver,
// or EMPTY_ANNOTATED_TYPE of there should be a receiver but
// no annotation
// value of anno for receiver or null if there should be no receiver anno
// },
// ...
// }
...
...
@@ -56,15 +51,13 @@ public class ConstructorReceiverTest {
{
ConstructorReceiverTest
.
Middle
.
class
,
ConstructorReceiverTest
.
class
,
Integer
.
valueOf
(
10
),
Integer
.
valueOf
(
15
)
},
{
ConstructorReceiverTest
.
Middle
.
Inner
.
class
,
ConstructorReceiverTest
.
Middle
.
class
,
Integer
.
valueOf
(
100
),
Integer
.
valueOf
(
150
)
},
{
ConstructorReceiverTest
.
Middle
.
Inner
.
Innermost
.
class
,
ConstructorReceiverTest
.
Middle
.
Inner
.
class
,
Integer
.
valueOf
(
1000
),
Integer
.
valueOf
(
1500
)
},
{
ConstructorReceiverTest
.
Middle
.
InnerNoReceiver
.
class
,
ConstructorReceiverTest
.
Middle
.
class
,
Integer
.
valueOf
(
300
),
EMPTY_ANNOTATED_TYPE
},
{
ConstructorReceiverTest
.
Middle
.
InnerNoReceiver
.
class
,
ConstructorReceiverTest
.
Middle
.
class
,
Integer
.
valueOf
(
300
),
null
},
{
ConstructorReceiverTest
.
Nested
.
class
,
null
,
Integer
.
valueOf
(
20
),
null
},
{
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
class
,
ConstructorReceiverTest
.
Nested
.
class
,
Integer
.
valueOf
(
200
),
Integer
.
valueOf
(
250
)},
{
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
NestedInner
.
class
,
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
class
,
Integer
.
valueOf
(
2000
),
Integer
.
valueOf
(
2500
)},
{
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
NestedInnerNoReceiver
.
class
,
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
class
,
Integer
.
valueOf
(
4000
),
EMPTY_ANNOTATED_TYPE
},
{
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
SecondNestedInnerNoReceiver
.
class
,
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
class
,
Integer
.
valueOf
(
5000
),
EMPTY_ANNOTATED_TYPE
},
{
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
NestedInnerNoReceiver
.
class
,
ConstructorReceiverTest
.
Nested
.
NestedMiddle
.
class
,
Integer
.
valueOf
(
4000
),
null
},
};
@DataProvider
public
Object
[][]
data
()
{
return
TESTS
;
}
...
...
@@ -78,27 +71,14 @@ public class ConstructorReceiverTest {
c
=
toTest
.
getDeclaredConstructor
(
ctorParamType
);
AnnotatedType
annotatedReceiverType
=
c
.
getAnnotatedReceiverType
();
// Some Constructors doesn't conceptually have a receiver, they should return null
if
(
receiverVal
==
null
)
{
assertNull
(
annotatedReceiverType
,
"getAnnotatedReciverType should return null for Constructor: "
+
c
);
return
;
}
// check that getType() matches the receiver
assertEquals
(
annotatedReceiverType
.
getType
(),
ctorParamType
,
"getType() doesn't match receiver type: "
+
ctorParamType
);
Annotation
[]
receiverAnnotations
=
annotatedReceiverType
.
getAnnotations
();
// Some Constructors have no annotations on but in theory can have a receiver
if
(
receiverVal
.
equals
(
EMPTY_ANNOTATED_TYPE
))
{
assertEquals
(
receiverAnnotations
.
length
,
0
,
"expecting an empty annotated type for: "
+
c
);
if
(
receiverVal
==
null
)
{
assertEquals
(
receiverAnnotations
.
length
,
0
,
Arrays
.
asList
(
receiverAnnotations
).
toString
()
+
" should be empty. Looking at 'length': "
);
return
;
}
// The rest should have annotations
assertEquals
(
receiverAnnotations
.
length
,
1
,
"expecting a 1 element array. Looking at 'length': "
);
assertEquals
(((
Annot
)
receiverAnnotations
[
0
]).
value
(),
receiverVal
.
intValue
(),
" wrong annotation found. Found "
+
receiverAnnotations
[
0
]
+
...
...
@@ -156,10 +136,6 @@ public class ConstructorReceiverTest {
class
NestedInnerNoReceiver
{
@Annot
(
4000
)
public
NestedInnerNoReceiver
()
{}
}
class
SecondNestedInnerNoReceiver
{
@Annot
(
5000
)
public
SecondNestedInnerNoReceiver
(
NestedMiddle
NestedMiddle
.
this
)
{}
}
}
}
...
...
test/java/lang/annotation/typeAnnotations/GetAnnotatedReceiverType.java
浏览文件 @
8a271383
/*
* Copyright (c) 2013,
2014
Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -23,11 +23,10 @@
/*
* @test
* @bug 8024915
8044629
* @bug 8024915
*/
import
java.lang.reflect.AnnotatedType
;
import
java.lang.reflect.Executable
;
import
java.util.Arrays
;
public
class
GetAnnotatedReceiverType
{
...
...
@@ -43,115 +42,41 @@ public class GetAnnotatedReceiverType {
public
Inner1
(
GetAnnotatedReceiverType
GetAnnotatedReceiverType
.
this
)
{}
}
public
static
class
Nested
{
public
Nested
()
{}
public
class
NestedInner
{
public
NestedInner
()
{
}
public
Class
<?>
getLocalClass
()
{
class
NestedInnerLocal
{
public
NestedInnerLocal
()
{}
}
return
NestedInnerLocal
.
class
;
}
public
Class
<?>
getAnonymousClass
()
{
return
new
Object
()
{}.
getClass
();
}
}
}
public
class
Inner2
{
public
Inner2
()
{
}
public
class
Inner3
{
public
Inner3
()
{
}
public
Class
<?>
getLocalClass
()
{
class
InnerLocal
{
public
InnerLocal
()
{}
}
return
InnerLocal
.
class
;
}
public
Class
<?>
getAnonymousClass
()
{
return
new
Object
()
{}.
getClass
();
}
}
public
Class
<?>
getLocalClass
()
{
class
InnerLocal
{
public
InnerLocal
()
{}
}
return
InnerLocal
.
class
;
}
public
Class
<?>
getAnonymousClass
()
{
return
new
Object
()
{}.
getClass
();
}
}
private
static
int
failures
=
0
;
private
static
int
tests
=
0
;
public
static
void
main
(
String
[]
args
)
throws
NoSuchMethodException
{
checkEmptyAT
(
GetAnnotatedReceiverType
.
class
.
getMethod
(
"method"
),
checkEmptyAT
(
GetAnnotatedReceiverType
.
class
.
getMethod
(
"method"
)
.
getAnnotatedReceiverType
()
,
"getAnnotatedReceiverType for \"method\" should return an empty AnnotatedType"
);
checkEmptyAT
(
Inner0
.
class
.
getConstructor
(
GetAnnotatedReceiverType
.
class
),
checkEmptyAT
(
Inner0
.
class
.
getConstructor
(
GetAnnotatedReceiverType
.
class
)
.
getAnnotatedReceiverType
()
,
"getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType"
);
checkEmptyAT
(
GetAnnotatedReceiverType
.
class
.
getMethod
(
"method0"
),
checkEmptyAT
(
GetAnnotatedReceiverType
.
class
.
getMethod
(
"method0"
)
.
getAnnotatedReceiverType
()
,
"getAnnotatedReceiverType for \"method0\" should return an empty AnnotatedType"
);
checkEmptyAT
(
Inner1
.
class
.
getConstructor
(
GetAnnotatedReceiverType
.
class
),
checkEmptyAT
(
Inner1
.
class
.
getConstructor
(
GetAnnotatedReceiverType
.
class
)
.
getAnnotatedReceiverType
()
,
"getAnnotatedReceiverType for a ctor with a \"this\" should return an empty AnnotatedType"
);
checkNull
(
GetAnnotatedReceiverType
.
class
.
getMethod
(
"method4"
),
checkNull
(
GetAnnotatedReceiverType
.
class
.
getMethod
(
"method4"
)
.
getAnnotatedReceiverType
()
,
"getAnnotatedReceiverType() on a static method should return null"
);
// More nested, inner, local and anonymous classes
Nested
nested
=
new
Nested
();
Nested
.
NestedInner
instance
=
nested
.
new
NestedInner
();
checkNull
(
nested
.
getClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for a static class should return null"
);
checkEmptyAT
(
instance
.
getClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType"
);
checkNull
(
instance
.
getLocalClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for a local class should return null"
);
checkNull
(
instance
.
getAnonymousClass
().
getDeclaredConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for an anonymous class should return null"
);
GetAnnotatedReceiverType
outer
=
new
GetAnnotatedReceiverType
();
Inner2
instance2
=
outer
.
new
Inner2
();
checkEmptyAT
(
instance2
.
getClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType"
);
checkNull
(
instance2
.
getLocalClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for a local class should return null"
);
checkNull
(
instance2
.
getAnonymousClass
().
getDeclaredConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for an anonymous class should return null"
);
Inner2
.
Inner3
instance3
=
instance2
.
new
Inner3
();
checkEmptyAT
(
instance3
.
getClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType for a ctor without a \"this\" should return an empty AnnotatedType"
);
checkNull
(
instance3
.
getLocalClass
().
getConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for a local class should return null"
);
checkNull
(
instance3
.
getAnonymousClass
().
getDeclaredConstructors
()[
0
],
"getAnnotatedReceiverType() on a constructor for an anonymous class should return null"
);
if
(
failures
!=
0
)
throw
new
RuntimeException
(
"Test failed, see log for details"
);
else
if
(
tests
!=
1
5
)
else
if
(
tests
!=
5
)
throw
new
RuntimeException
(
"Not all cases ran, failing"
);
}
private
static
void
checkNull
(
Executable
e
,
String
msg
)
{
AnnotatedType
a
=
e
.
getAnnotatedReceiverType
();
if
(
a
!=
null
)
{
private
static
void
checkNull
(
Object
o
,
String
msg
)
{
if
(
o
!=
null
)
{
failures
++;
System
.
err
.
println
(
msg
+
": "
+
e
);
System
.
err
.
println
(
msg
);
}
tests
++;
}
private
static
void
checkEmptyAT
(
Executable
e
,
String
msg
)
{
AnnotatedType
a
=
e
.
getAnnotatedReceiverType
();
private
static
void
checkEmptyAT
(
AnnotatedType
a
,
String
msg
)
{
if
(
a
.
getAnnotations
().
length
!=
0
)
{
failures
++;
System
.
err
.
print
(
msg
+
": "
+
e
);
System
.
err
.
print
(
msg
);
}
tests
++;
}
...
...
test/java/lang/annotation/typeAnnotations/TestExecutableGetAnnotatedType.java
浏览文件 @
8a271383
...
...
@@ -73,11 +73,13 @@ public class TestExecutableGetAnnotatedType {
testParameters
(
e
.
getParameters
());
}
// should test constructors as well, see JDK-8044629
@Test
(
dataProvider
=
"genericMethodData"
)
public
void
testGenericReceiverType
(
Executable
e
)
throws
Exception
{
testReceiverType0
(
e
);
}
// should test constructors as well, see JDK-8044629
@Test
(
dataProvider
=
"methodData"
)
public
void
testReceiverType
(
Executable
e
)
throws
Exception
{
testReceiverType0
(
e
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录