< prev index next >
test/hotspot/jtreg/runtime/Nestmates/reflectionAPI/TestReflectionAPI.java
Print this page
@@ -28,10 +28,11 @@
* @compile TestReflectionAPI.java
* PackagedNestHost.java
* PackagedNestHost2.java
* SampleNest.java
* Hosts.java
+ * InvalidNestHost.java
*
* @compile MemberNoHost.jcod
* MemberMissingHost.jcod
* MemberNotInstanceHost.jcod
* MemberNotOurHost.jcod
@@ -43,10 +44,12 @@
* HostOfMemberNoHost.jcod
* HostOfMemberMissingHost.jcod
* HostOfMemberNotInstanceHost.jcod
* HostOfMemberNotOurHost.jcod
* HostOfMemberMalformedHost.jcod
+ * HostWithSelfMember.jcod
+ * HostWithDuplicateMembers.jcod
*
* @run main/othervm TestReflectionAPI
*/
// We need a nest member class that is invalid for each of the possible reasons,
@@ -59,10 +62,11 @@
// Note that all the .java files must be compiled in the same step, while all
// .jcod files must be compiled in a later step.
import java.util.Arrays;
import java.util.Comparator;
+import java.util.HashSet;
public class TestReflectionAPI {
// Valid nest member
static class Member {}
@@ -152,11 +156,22 @@
// Sampling of "good" checks
Class<?>[] good = { Object.class, Object[].class, int.class};
checkSingletonNests(good);
// More thorough correctness check
- checkNest(SampleNest.class, SampleNest.nestedTypes());
+ checkNest(SampleNest.class, SampleNest.nestedTypes(), false);
+
+ // Special cases - legal but not produced by javac
+ checkNest(HostWithSelfMember.class,
+ new Class<?>[] { HostWithSelfMember.class,
+ HostWithSelfMember.Member.class },
+ true);
+ checkNest(HostWithDuplicateMembers.class,
+ new Class<?>[] { HostWithDuplicateMembers.class,
+ HostWithDuplicateMembers.Member1.class,
+ HostWithDuplicateMembers.Member2.class },
+ true);
// Hosts with "bad" members
Class<?>[] bad = {
HostOfMemberNoHost.class,
HostOfMemberMissingHost.class,
@@ -175,13 +190,13 @@
"Nest member HostOfMemberNoHost$MemberNoHost in HostOfMemberNoHost " +
"declares a different nest host of HostOfMemberNoHost$MemberNoHost",
"Unable to load nest-host class (NestHost) of " +
"HostOfMemberMissingHost$MemberMissingHost",
"Type HostOfMemberNotOurHost$MemberNotOurHost is not a nest member " +
- "of java.lang.Object: current type is not listed as a nest member",
+ "of InvalidNestHost: current type is not listed as a nest member",
"Type HostOfMemberNotInstanceHost$MemberNotInstanceHost is not a nest " +
- "member of [Ljava.lang.Object;: nest-host is not an instance class!",
+ "member of [LInvalidNestHost;: current type is not listed as a nest member",
"Incompatible magic value 3735928559 in class file MalformedHost",
};
for (int i = 0; i < bad.length; i++) {
try {
bad[i].getNestMembers();
@@ -224,21 +239,33 @@
(mates ? "" : "not ") + "be");
}
static Comparator<Class<?>> cmp = Comparator.comparing(Class::getName);
- static void checkNest(Class<?> host, Class<?>[] unsortedTypes) {
+ static void checkNest(Class<?> host, Class<?>[] unsortedTypes, boolean expectDups) {
Class<?>[] members = host.getNestMembers();
Arrays.sort(members, cmp);
Class<?>[] nestedTypes = unsortedTypes.clone();
Arrays.sort(nestedTypes, cmp);
printMembers(host, members);
printDeclared(host, nestedTypes);
if (!Arrays.equals(members, nestedTypes)) {
+ if (!expectDups) {
throw new Error("Class " + host.getName() + " has different members " +
"compared to declared classes");
}
+ else {
+ // get rid of duplicates
+ Class<?>[] memberSet =
+ new HashSet<Class<?>>(Arrays.asList(members)).toArray(new Class<?>[0]);
+ Arrays.sort(memberSet, cmp);
+ if (!Arrays.equals(memberSet, nestedTypes)) {
+ throw new Error("Class " + host.getName() + " has different members " +
+ "compared to declared classes, even after duplicate removal");
+ }
+ }
+ }
// verify all the relationships that must hold for nest members
for (Class<?> a : members) {
checkHost(a, host);
checkNestmates(a, host, true);
Class<?>[] aMembers = a.getNestMembers();
< prev index next >