Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
c2c6fb6d
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看板
提交
c2c6fb6d
编写于
9月 12, 2013
作者:
S
sjiang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8023529: OpenMBeanInfoSupport.equals/hashCode throw NPE
Reviewed-by: dholmes, dfuchs
上级
0508fa48
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
375 addition
and
2 deletion
+375
-2
src/share/classes/javax/management/openmbean/OpenMBeanInfoSupport.java
...sses/javax/management/openmbean/OpenMBeanInfoSupport.java
+6
-2
test/javax/management/openmbean/OpenMBeanInfoEqualsNPETest.java
...avax/management/openmbean/OpenMBeanInfoEqualsNPETest.java
+196
-0
test/javax/management/openmbean/OpenMBeanInfoHashCodeNPETest.java
...ax/management/openmbean/OpenMBeanInfoHashCodeNPETest.java
+173
-0
未找到文件。
src/share/classes/javax/management/openmbean/OpenMBeanInfoSupport.java
浏览文件 @
c2c6fb6d
...
...
@@ -31,6 +31,7 @@ package javax.management.openmbean;
//
import
java.util.Arrays
;
import
java.util.HashSet
;
import
java.util.Objects
;
import
javax.management.Descriptor
;
import
javax.management.MBeanAttributeInfo
;
...
...
@@ -269,8 +270,9 @@ public class OpenMBeanInfoSupport
//
// their MBean className should be equal
if
(
!
this
.
getClassName
().
equals
(
other
.
getClassName
())
)
if
(
!
Objects
.
equals
(
this
.
getClassName
(),
other
.
getClassName
()))
{
return
false
;
}
// their infos on attributes should be equal (order not
// significant => equality between sets, not arrays or lists)
...
...
@@ -342,7 +344,9 @@ public class OpenMBeanInfoSupport
//
if
(
myHashCode
==
null
)
{
int
value
=
0
;
value
+=
this
.
getClassName
().
hashCode
();
if
(
this
.
getClassName
()
!=
null
)
{
value
+=
this
.
getClassName
().
hashCode
();
}
value
+=
arraySetHash
(
this
.
getAttributes
());
value
+=
arraySetHash
(
this
.
getConstructors
());
value
+=
arraySetHash
(
this
.
getOperations
());
...
...
test/javax/management/openmbean/OpenMBeanInfoEqualsNPETest.java
0 → 100644
浏览文件 @
c2c6fb6d
/*
* 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import
javax.management.MBeanNotificationInfo
;
import
javax.management.MBeanOperationInfo
;
import
javax.management.modelmbean.DescriptorSupport
;
import
javax.management.openmbean.OpenMBeanAttributeInfo
;
import
javax.management.openmbean.OpenMBeanAttributeInfoSupport
;
import
javax.management.openmbean.OpenMBeanConstructorInfo
;
import
javax.management.openmbean.OpenMBeanConstructorInfoSupport
;
import
javax.management.openmbean.OpenMBeanInfo
;
import
javax.management.openmbean.OpenMBeanInfoSupport
;
import
javax.management.openmbean.OpenMBeanOperationInfo
;
import
javax.management.openmbean.OpenMBeanOperationInfoSupport
;
import
javax.management.openmbean.OpenMBeanParameterInfo
;
import
javax.management.openmbean.OpenMBeanParameterInfoSupport
;
import
javax.management.openmbean.SimpleType
;
/*
* @test
* @bug 8023529
* @summary Test that OpenMBean*Info.equals do not throw NPE
* @author Shanliang JIANG
* @run clean OpenMBeanInfoEqualsNPETest
* @run build OpenMBeanInfoEqualsNPETest
* @run main OpenMBeanInfoEqualsNPETest
*/
public
class
OpenMBeanInfoEqualsNPETest
{
private
static
int
failed
=
0
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
System
.
out
.
println
(
"---OpenMBeanInfoEqualsNPETest-main ..."
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanAttributeInfoSupport..."
);
OpenMBeanAttributeInfo
openMBeanAttributeInfo0
=
new
OpenMBeanAttributeInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
true
,
true
,
false
,
1
,
new
Integer
[]{
1
,
2
,
3
});
OpenMBeanAttributeInfo
openMBeanAttributeInfo
=
new
OpenMBeanAttributeInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
true
,
true
,
false
,
null
,
new
Integer
[]{
1
,
2
,
3
});
test
(
openMBeanAttributeInfo0
,
openMBeanAttributeInfo
,
"defaultValue"
);
openMBeanAttributeInfo
=
new
OpenMBeanAttributeInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
true
,
true
,
false
,
1
,
null
);
test
(
openMBeanAttributeInfo0
,
openMBeanAttributeInfo
,
"legalValues"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanConstructorInfoSupport..."
);
OpenMBeanConstructorInfo
openMBeanConstructorInfo0
=
new
OpenMBeanConstructorInfoSupport
(
"name"
,
"description"
,
new
OpenMBeanParameterInfo
[]{},
new
DescriptorSupport
());
OpenMBeanConstructorInfo
openMBeanConstructorInfo
;
openMBeanConstructorInfo
=
new
OpenMBeanConstructorInfoSupport
(
"name"
,
"description"
,
null
,
new
DescriptorSupport
());
test
(
openMBeanConstructorInfo0
,
openMBeanConstructorInfo
,
"sigs"
);
openMBeanConstructorInfo
=
new
OpenMBeanConstructorInfoSupport
(
"name"
,
"description"
,
new
OpenMBeanParameterInfo
[]{},
null
);
test
(
openMBeanConstructorInfo0
,
openMBeanConstructorInfo
,
"Descriptor"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanOperationInfoSupport..."
);
OpenMBeanOperationInfo
openMBeanOperationInfo0
=
new
OpenMBeanOperationInfoSupport
(
"name"
,
"description"
,
new
OpenMBeanParameterInfo
[]{},
SimpleType
.
INTEGER
,
1
,
new
DescriptorSupport
());
OpenMBeanOperationInfo
openMBeanOperationInfo
;
openMBeanOperationInfo
=
new
OpenMBeanOperationInfoSupport
(
"name"
,
"description"
,
null
,
SimpleType
.
INTEGER
,
1
,
new
DescriptorSupport
());
test
(
openMBeanOperationInfo0
,
openMBeanOperationInfo
,
"sigs"
);
openMBeanOperationInfo
=
new
OpenMBeanOperationInfoSupport
(
"name"
,
"description"
,
new
OpenMBeanParameterInfo
[]{},
SimpleType
.
INTEGER
,
MBeanOperationInfo
.
UNKNOWN
,
null
);
test
(
openMBeanOperationInfo0
,
openMBeanOperationInfo
,
"Descriptor"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanParameterInfoSupport 1..."
);
OpenMBeanParameterInfo
openMBeanParameterInfo0
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
0
,
-
1
,
1
);
OpenMBeanParameterInfo
openMBeanParameterInfo
;
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
null
,
-
1
,
1
);
test
(
openMBeanParameterInfo0
,
openMBeanParameterInfo
,
"default value"
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
0
,
null
,
1
);
test
(
openMBeanParameterInfo0
,
openMBeanParameterInfo
,
"min value"
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
0
,
-
1
,
null
);
test
(
openMBeanParameterInfo0
,
openMBeanParameterInfo
,
"max value"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanParameterInfoSupport 2..."
);
openMBeanParameterInfo0
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
1
,
new
Integer
[]{-
1
,
1
,
2
});
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
null
,
new
Integer
[]{-
1
,
1
,
2
});
test
(
openMBeanParameterInfo0
,
openMBeanParameterInfo
,
"default value"
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
1
,
null
);
test
(
openMBeanParameterInfo0
,
openMBeanParameterInfo
,
"legal values"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanInfoSupport..."
);
String
className
=
"toto"
;
String
description
=
"titi"
;
OpenMBeanAttributeInfo
[]
attrInfos
=
new
OpenMBeanAttributeInfo
[]{};
OpenMBeanConstructorInfo
[]
constrInfos
=
new
OpenMBeanConstructorInfo
[]{};
OpenMBeanOperationInfo
[]
operaInfos
=
new
OpenMBeanOperationInfo
[]{};
MBeanNotificationInfo
[]
notifInfos
=
new
MBeanNotificationInfo
[]{};
OpenMBeanInfo
ominfo0
=
new
OpenMBeanInfoSupport
(
"toto"
,
description
,
attrInfos
,
constrInfos
,
operaInfos
,
notifInfos
);
OpenMBeanInfo
ominfo
=
new
OpenMBeanInfoSupport
(
null
,
description
,
attrInfos
,
constrInfos
,
operaInfos
,
notifInfos
);
test
(
ominfo0
,
ominfo
,
"class name"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
null
,
attrInfos
,
constrInfos
,
operaInfos
,
notifInfos
);
test
(
ominfo0
,
ominfo
,
"description"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
null
,
constrInfos
,
operaInfos
,
notifInfos
);
test
(
ominfo0
,
ominfo
,
"attrInfos"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
attrInfos
,
null
,
operaInfos
,
notifInfos
);
test
(
ominfo0
,
ominfo
,
"constructor infos"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
attrInfos
,
constrInfos
,
null
,
notifInfos
);
test
(
ominfo0
,
ominfo
,
"operation infos"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
attrInfos
,
constrInfos
,
operaInfos
,
null
);
test
(
ominfo0
,
ominfo
,
"notif infos"
);
if
(
failed
>
0
)
{
throw
new
RuntimeException
(
"Test failed: "
+
failed
);
}
else
{
System
.
out
.
println
(
"---Test: PASSED"
);
}
}
private
static
void
test
(
Object
obj1
,
Object
obj2
,
String
param
)
{
try
{
obj1
.
equals
(
obj2
);
System
.
out
.
println
(
"OK-1: "
+
obj1
.
getClass
().
getSimpleName
()+
".equals worked with a null field: "
+
param
);
}
catch
(
NullPointerException
npe
)
{
System
.
out
.
println
(
"--->KO-1!!! "
+
obj1
.
getClass
().
getSimpleName
()+
".equals got NPE with a null field: "
+
param
);
npe
.
printStackTrace
();
failed
++;
}
try
{
obj2
.
equals
(
obj1
);
System
.
out
.
println
(
"OK-2: "
+
obj2
.
getClass
().
getSimpleName
()+
".equals worked with a null field: "
+
param
);
}
catch
(
NullPointerException
npe
)
{
System
.
out
.
println
(
"--->KO-2!!! "
+
obj2
.
getClass
().
getSimpleName
()+
".equals got NPE with a null field: "
+
param
);
npe
.
printStackTrace
();
failed
++;
}
try
{
obj1
.
equals
(
null
);
obj2
.
equals
(
null
);
System
.
out
.
println
(
"OK-3: "
+
obj1
.
getClass
().
getSimpleName
()+
".equals worked with a null object."
);
}
catch
(
NullPointerException
npe
)
{
System
.
out
.
println
(
"--->KO-3!!! "
+
obj1
.
getClass
().
getSimpleName
()+
".equals got NPE with a null object."
);
npe
.
printStackTrace
();
failed
++;
}
}
}
test/javax/management/openmbean/OpenMBeanInfoHashCodeNPETest.java
0 → 100644
浏览文件 @
c2c6fb6d
/*
* 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import
javax.management.MBeanNotificationInfo
;
import
javax.management.modelmbean.DescriptorSupport
;
import
javax.management.openmbean.OpenMBeanAttributeInfo
;
import
javax.management.openmbean.OpenMBeanAttributeInfoSupport
;
import
javax.management.openmbean.OpenMBeanConstructorInfo
;
import
javax.management.openmbean.OpenMBeanConstructorInfoSupport
;
import
javax.management.openmbean.OpenMBeanInfo
;
import
javax.management.openmbean.OpenMBeanInfoSupport
;
import
javax.management.openmbean.OpenMBeanOperationInfo
;
import
javax.management.openmbean.OpenMBeanOperationInfoSupport
;
import
javax.management.openmbean.OpenMBeanParameterInfo
;
import
javax.management.openmbean.OpenMBeanParameterInfoSupport
;
import
javax.management.openmbean.SimpleType
;
/*
* @test
* @bug 8023529
* @summary Test that OpenMBean*Info.hashCode do not throw NPE
* @author Shanliang JIANG
* @run clean OpenMBeanInfoHashCodeNPETest
* @run build OpenMBeanInfoHashCodeNPETest
* @run main OpenMBeanInfoHashCodeNPETest
*/
public
class
OpenMBeanInfoHashCodeNPETest
{
private
static
int
failed
=
0
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
System
.
out
.
println
(
"---OpenMBeanInfoHashCodeNPETest-main ..."
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanInfohashCodeTest..."
);
OpenMBeanAttributeInfo
openMBeanAttributeInfo
=
new
OpenMBeanAttributeInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
true
,
true
,
false
,
null
,
new
Integer
[]{
1
,
2
,
3
});
test
(
openMBeanAttributeInfo
,
"defaultValue"
);
openMBeanAttributeInfo
=
new
OpenMBeanAttributeInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
true
,
true
,
false
,
1
,
null
);
test
(
openMBeanAttributeInfo
,
"legalValues"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanConstructorInfoSupport..."
);
OpenMBeanConstructorInfo
openMBeanConstructorInfo
;
openMBeanConstructorInfo
=
new
OpenMBeanConstructorInfoSupport
(
"name"
,
"description"
,
null
,
new
DescriptorSupport
());
test
(
openMBeanConstructorInfo
,
"sigs"
);
openMBeanConstructorInfo
=
new
OpenMBeanConstructorInfoSupport
(
"name"
,
"description"
,
new
OpenMBeanParameterInfo
[]{},
null
);
test
(
openMBeanConstructorInfo
,
"Descriptor"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanOperationInfoSupport..."
);
OpenMBeanOperationInfo
openMBeanOperationInfo
;
openMBeanOperationInfo
=
new
OpenMBeanOperationInfoSupport
(
"name"
,
"description"
,
null
,
SimpleType
.
INTEGER
,
1
,
new
DescriptorSupport
());
test
(
openMBeanOperationInfo
,
"sigs"
);
openMBeanOperationInfo
=
new
OpenMBeanOperationInfoSupport
(
"name"
,
"description"
,
new
OpenMBeanParameterInfo
[]{},
SimpleType
.
INTEGER
,
1
,
null
);
test
(
openMBeanOperationInfo
,
"Descriptor"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanParameterInfoSupport 1..."
);
OpenMBeanParameterInfo
openMBeanParameterInfo
;
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
null
,
-
1
,
1
);
test
(
openMBeanParameterInfo
,
"default value"
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
0
,
null
,
1
);
test
(
openMBeanParameterInfo
,
"min value"
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
0
,
-
1
,
null
);
test
(
openMBeanParameterInfo
,
"max value"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanParameterInfoSupport 2..."
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
1
,
new
Integer
[]{-
1
,
1
,
2
});
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
null
,
new
Integer
[]{-
1
,
1
,
2
});
test
(
openMBeanParameterInfo
,
"default value"
);
openMBeanParameterInfo
=
new
OpenMBeanParameterInfoSupport
(
"name"
,
"description"
,
SimpleType
.
INTEGER
,
1
,
null
);
test
(
openMBeanParameterInfo
,
"legal values"
);
// ----
System
.
out
.
println
(
"\n---Testing on OpenMBeanInfoSupport..."
);
String
className
=
"toto"
;
String
description
=
"titi"
;
OpenMBeanAttributeInfo
[]
attrInfos
=
new
OpenMBeanAttributeInfo
[]{};
OpenMBeanConstructorInfo
[]
constrInfos
=
new
OpenMBeanConstructorInfo
[]{};
OpenMBeanOperationInfo
[]
operaInfos
=
new
OpenMBeanOperationInfo
[]{};
MBeanNotificationInfo
[]
notifInfos
=
new
MBeanNotificationInfo
[]{};
OpenMBeanInfo
ominfo
=
new
OpenMBeanInfoSupport
(
null
,
description
,
attrInfos
,
constrInfos
,
operaInfos
,
notifInfos
);
test
(
ominfo
,
"class name"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
null
,
attrInfos
,
constrInfos
,
operaInfos
,
notifInfos
);
test
(
ominfo
,
"description"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
null
,
constrInfos
,
operaInfos
,
notifInfos
);
test
(
ominfo
,
"attrInfos"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
attrInfos
,
null
,
operaInfos
,
notifInfos
);
test
(
ominfo
,
"constructor infos"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
attrInfos
,
constrInfos
,
null
,
notifInfos
);
test
(
ominfo
,
"operation infos"
);
ominfo
=
new
OpenMBeanInfoSupport
(
className
,
description
,
attrInfos
,
constrInfos
,
operaInfos
,
null
);
test
(
ominfo
,
"notif infos"
);
if
(
failed
>
0
)
{
throw
new
RuntimeException
(
"Test failed: "
+
failed
);
}
else
{
System
.
out
.
println
(
"---Test: PASSED"
);
}
}
private
static
void
test
(
Object
obj
,
String
param
)
{
try
{
obj
.
hashCode
();
System
.
out
.
println
(
"OK-1: "
+
obj
.
getClass
().
getSimpleName
()+
".hashCode worked with a null paramer: "
+
param
);
}
catch
(
NullPointerException
npe
)
{
System
.
out
.
println
(
"--->KO-1!!! "
+
obj
.
getClass
().
getSimpleName
()+
".hashCode got NPE with null paramer: "
+
param
);
npe
.
printStackTrace
();
failed
++;
}
try
{
obj
.
toString
();
System
.
out
.
println
(
"OK-1: "
+
obj
.
getClass
().
getSimpleName
()+
".toString worked with a null paramer: "
+
param
);
}
catch
(
NullPointerException
npe
)
{
System
.
out
.
println
(
"--->KO-1!!! "
+
obj
.
getClass
().
getSimpleName
()+
".toString got NPE with null paramer: "
+
param
);
npe
.
printStackTrace
();
failed
++;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录