Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
b0983556
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看板
提交
b0983556
编写于
7月 04, 2013
作者:
A
alanb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8019622: (sl) ServiceLoader.next incorrect when creation and usages are in different contexts
Reviewed-by: mchung, ahgross, forax, psandoz
上级
1bc949f6
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
34 addition
and
6 deletion
+34
-6
src/share/classes/java/util/ServiceLoader.java
src/share/classes/java/util/ServiceLoader.java
+34
-6
未找到文件。
src/share/classes/java/util/ServiceLoader.java
浏览文件 @
b0983556
...
@@ -30,6 +30,9 @@ import java.io.IOException;
...
@@ -30,6 +30,9 @@ import java.io.IOException;
import
java.io.InputStream
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.InputStreamReader
;
import
java.net.URL
;
import
java.net.URL
;
import
java.security.AccessController
;
import
java.security.AccessControlContext
;
import
java.security.PrivilegedAction
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Enumeration
;
import
java.util.Enumeration
;
import
java.util.Iterator
;
import
java.util.Iterator
;
...
@@ -185,10 +188,13 @@ public final class ServiceLoader<S>
...
@@ -185,10 +188,13 @@ public final class ServiceLoader<S>
private
static
final
String
PREFIX
=
"META-INF/services/"
;
private
static
final
String
PREFIX
=
"META-INF/services/"
;
// The class or interface representing the service being loaded
// The class or interface representing the service being loaded
private
Class
<
S
>
service
;
private
final
Class
<
S
>
service
;
// The class loader used to locate, load, and instantiate providers
// The class loader used to locate, load, and instantiate providers
private
ClassLoader
loader
;
private
final
ClassLoader
loader
;
// The access control context taken when the ServiceLoader is created
private
final
AccessControlContext
acc
;
// Cached providers, in instantiation order
// Cached providers, in instantiation order
private
LinkedHashMap
<
String
,
S
>
providers
=
new
LinkedHashMap
<>();
private
LinkedHashMap
<
String
,
S
>
providers
=
new
LinkedHashMap
<>();
...
@@ -215,6 +221,7 @@ public final class ServiceLoader<S>
...
@@ -215,6 +221,7 @@ public final class ServiceLoader<S>
private
ServiceLoader
(
Class
<
S
>
svc
,
ClassLoader
cl
)
{
private
ServiceLoader
(
Class
<
S
>
svc
,
ClassLoader
cl
)
{
service
=
Objects
.
requireNonNull
(
svc
,
"Service interface cannot be null"
);
service
=
Objects
.
requireNonNull
(
svc
,
"Service interface cannot be null"
);
loader
=
(
cl
==
null
)
?
ClassLoader
.
getSystemClassLoader
()
:
cl
;
loader
=
(
cl
==
null
)
?
ClassLoader
.
getSystemClassLoader
()
:
cl
;
acc
=
(
System
.
getSecurityManager
()
!=
null
)
?
AccessController
.
getContext
()
:
null
;
reload
();
reload
();
}
}
...
@@ -327,7 +334,7 @@ public final class ServiceLoader<S>
...
@@ -327,7 +334,7 @@ public final class ServiceLoader<S>
this
.
loader
=
loader
;
this
.
loader
=
loader
;
}
}
p
ublic
boolean
hasNext
()
{
p
rivate
boolean
hasNextService
()
{
if
(
nextName
!=
null
)
{
if
(
nextName
!=
null
)
{
return
true
;
return
true
;
}
}
...
@@ -352,10 +359,9 @@ public final class ServiceLoader<S>
...
@@ -352,10 +359,9 @@ public final class ServiceLoader<S>
return
true
;
return
true
;
}
}
p
ublic
S
next
()
{
p
rivate
S
nextService
()
{
if
(!
hasNext
())
{
if
(!
hasNext
Service
())
throw
new
NoSuchElementException
();
throw
new
NoSuchElementException
();
}
String
cn
=
nextName
;
String
cn
=
nextName
;
nextName
=
null
;
nextName
=
null
;
Class
<?>
c
=
null
;
Class
<?>
c
=
null
;
...
@@ -381,6 +387,28 @@ public final class ServiceLoader<S>
...
@@ -381,6 +387,28 @@ public final class ServiceLoader<S>
throw
new
Error
();
// This cannot happen
throw
new
Error
();
// This cannot happen
}
}
public
boolean
hasNext
()
{
if
(
acc
==
null
)
{
return
hasNextService
();
}
else
{
PrivilegedAction
<
Boolean
>
action
=
new
PrivilegedAction
<
Boolean
>()
{
public
Boolean
run
()
{
return
hasNextService
();
}
};
return
AccessController
.
doPrivileged
(
action
,
acc
);
}
}
public
S
next
()
{
if
(
acc
==
null
)
{
return
nextService
();
}
else
{
PrivilegedAction
<
S
>
action
=
new
PrivilegedAction
<
S
>()
{
public
S
run
()
{
return
nextService
();
}
};
return
AccessController
.
doPrivileged
(
action
,
acc
);
}
}
public
void
remove
()
{
public
void
remove
()
{
throw
new
UnsupportedOperationException
();
throw
new
UnsupportedOperationException
();
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录