< prev index next >
test/hotspot/jtreg/runtime/Nestmates/reflectionAPI/TestReflectionAPI.java
Print this page
*** 28,37 ****
--- 28,38 ----
* @compile TestReflectionAPI.java
* PackagedNestHost.java
* PackagedNestHost2.java
* SampleNest.java
* Hosts.java
+ * InvalidNestHost.java
*
* @compile MemberNoHost.jcod
* MemberMissingHost.jcod
* MemberNotInstanceHost.jcod
* MemberNotOurHost.jcod
*** 43,52 ****
--- 44,55 ----
* 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,68 ****
--- 62,72 ----
// 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,162 ****
// Sampling of "good" checks
Class<?>[] good = { Object.class, Object[].class, int.class};
checkSingletonNests(good);
// More thorough correctness check
! checkNest(SampleNest.class, SampleNest.nestedTypes());
// Hosts with "bad" members
Class<?>[] bad = {
HostOfMemberNoHost.class,
HostOfMemberMissingHost.class,
--- 156,177 ----
// Sampling of "good" checks
Class<?>[] good = { Object.class, Object[].class, int.class};
checkSingletonNests(good);
// More thorough correctness check
! 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,187 ****
"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",
"Type HostOfMemberNotInstanceHost$MemberNotInstanceHost is not a nest " +
! "member of [Ljava.lang.Object;: nest-host is not an instance class!",
"Incompatible magic value 3735928559 in class file MalformedHost",
};
for (int i = 0; i < bad.length; i++) {
try {
bad[i].getNestMembers();
--- 190,202 ----
"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 InvalidNestHost: current type is not listed as a nest member",
"Type HostOfMemberNotInstanceHost$MemberNotInstanceHost is not a nest " +
! "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,244 ****
(mates ? "" : "not ") + "be");
}
static Comparator<Class<?>> cmp = Comparator.comparing(Class::getName);
! static void checkNest(Class<?> host, Class<?>[] unsortedTypes) {
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)) {
throw new Error("Class " + host.getName() + " has different members " +
"compared to declared classes");
}
// 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();
--- 239,271 ----
(mates ? "" : "not ") + "be");
}
static Comparator<Class<?>> cmp = Comparator.comparing(Class::getName);
! 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 >