96 97 @Test 98 public void defineHiddenClass() throws Throwable { 99 // define a hidden class 100 Lookup lookup = MethodHandles.lookup().defineHiddenClassWithClassData(T_CLASS_BYTES, classData, false, NESTMATE); 101 Class<?> c = lookup.lookupClass(); 102 assertTrue(c.getNestHost() == DefineClassWithClassData.class); 103 assertTrue(c.isHiddenClass()); 104 assertEquals(classData, injectedData(c)); 105 106 // invoke int test(DefineClassWithClassData o) 107 int x = testInjectedClass(c); 108 assertTrue(x == privMethod()); 109 110 // dynamic nestmate is not listed in the return array of getNestMembers 111 assertTrue(Stream.of(c.getNestHost().getNestMembers()).noneMatch(k -> k == c)); 112 assertTrue(c.isNestmateOf(DefineClassWithClassData.class)); 113 } 114 115 @Test 116 public void defineWeakClass() throws Throwable { 117 // define a weak class 118 Lookup lookup = MethodHandles.lookup().defineHiddenClassWithClassData(T_CLASS_BYTES, classData, true, WEAK); 119 Class<?> c = lookup.lookupClass(); 120 assertTrue(c.getNestHost() == c); 121 assertTrue(c.isHiddenClass()); 122 } 123 124 @Test(expectedExceptions = IllegalAccessException.class) 125 public void noPrivateLookupAccess() throws Throwable { 126 Lookup lookup = MethodHandles.lookup().dropLookupMode(Lookup.PRIVATE); 127 lookup.defineHiddenClassWithClassData(T2_CLASS_BYTES, classData, false, NESTMATE); 128 } 129 130 @Test 131 public void teleportToNestmate() throws Throwable { 132 Lookup lookup = MethodHandles.lookup() 133 .defineHiddenClassWithClassData(T_CLASS_BYTES, classData, false, NESTMATE); 134 Class<?> c = lookup.lookupClass(); 135 assertTrue(c.getNestHost() == DefineClassWithClassData.class); 136 assertEquals(classData, injectedData(c)); 137 assertTrue(c.isHiddenClass()); 138 | 96 97 @Test 98 public void defineHiddenClass() throws Throwable { 99 // define a hidden class 100 Lookup lookup = MethodHandles.lookup().defineHiddenClassWithClassData(T_CLASS_BYTES, classData, false, NESTMATE); 101 Class<?> c = lookup.lookupClass(); 102 assertTrue(c.getNestHost() == DefineClassWithClassData.class); 103 assertTrue(c.isHiddenClass()); 104 assertEquals(classData, injectedData(c)); 105 106 // invoke int test(DefineClassWithClassData o) 107 int x = testInjectedClass(c); 108 assertTrue(x == privMethod()); 109 110 // dynamic nestmate is not listed in the return array of getNestMembers 111 assertTrue(Stream.of(c.getNestHost().getNestMembers()).noneMatch(k -> k == c)); 112 assertTrue(c.isNestmateOf(DefineClassWithClassData.class)); 113 } 114 115 @Test 116 public void defineStrongClass() throws Throwable { 117 Lookup lookup = MethodHandles.lookup().defineHiddenClassWithClassData(T_CLASS_BYTES, classData, true, STRONG); 118 Class<?> c = lookup.lookupClass(); 119 assertTrue(c.getNestHost() == c); 120 assertTrue(c.isHiddenClass()); 121 } 122 123 @Test(expectedExceptions = IllegalAccessException.class) 124 public void noPrivateLookupAccess() throws Throwable { 125 Lookup lookup = MethodHandles.lookup().dropLookupMode(Lookup.PRIVATE); 126 lookup.defineHiddenClassWithClassData(T2_CLASS_BYTES, classData, false, NESTMATE); 127 } 128 129 @Test 130 public void teleportToNestmate() throws Throwable { 131 Lookup lookup = MethodHandles.lookup() 132 .defineHiddenClassWithClassData(T_CLASS_BYTES, classData, false, NESTMATE); 133 Class<?> c = lookup.lookupClass(); 134 assertTrue(c.getNestHost() == DefineClassWithClassData.class); 135 assertEquals(classData, injectedData(c)); 136 assertTrue(c.isHiddenClass()); 137 |