90 91 @Test 92 public void hiddenNestmate() throws Throwable { 93 // define a hidden nestmate class 94 Lookup lookup = MethodHandles.lookup().defineHiddenClass(bytes, false, NESTMATE); 95 Class<?> c = lookup.lookupClass(); 96 assertNestmate(lookup); 97 98 // invoke int test(HiddenNestmateTest o) via MethodHandle 99 MethodHandle ctor = lookup.findConstructor(c, MethodType.methodType(void.class)); 100 MethodHandle mh = lookup.findVirtual(c, "test", MethodType.methodType(int.class, HiddenNestmateTest.class)); 101 int x = (int)mh.bindTo(ctor.invoke()).invokeExact( this); 102 assertTrue(x == privMethod()); 103 104 // invoke int test(HiddenNestmateTest o) 105 int x1 = testInjectedClass(c); 106 assertTrue(x1 == privMethod()); 107 } 108 109 @Test 110 public void hiddenWeakClass() throws Throwable { 111 // define a weak class 112 Lookup lookup = MethodHandles.lookup().defineHiddenClass(bytes, false, NESTMATE, WEAK); 113 assertNestmate(lookup); 114 } 115 116 @Test(expectedExceptions = IllegalAccessException.class) 117 public void noPrivateLookupAccess() throws Throwable { 118 Lookup lookup = MethodHandles.lookup().dropLookupMode(Lookup.PRIVATE); 119 lookup.defineHiddenClass(bytes, false, NESTMATE); 120 } 121 122 public void teleportToNestmate() throws Throwable { 123 Lookup lookup = MethodHandles.lookup().defineHiddenClass(bytes, false, NESTMATE); 124 assertNestmate(lookup); 125 126 // Teleport to a hidden nestmate 127 Lookup lc = MethodHandles.lookup().in(lookup.lookupClass()); 128 assertTrue((lc.lookupModes() & PRIVATE) != 0); 129 Lookup lc2 = lc.defineHiddenClass(bytes, false, NESTMATE); 130 assertNestmate(lc2); 131 } 132 | 90 91 @Test 92 public void hiddenNestmate() throws Throwable { 93 // define a hidden nestmate class 94 Lookup lookup = MethodHandles.lookup().defineHiddenClass(bytes, false, NESTMATE); 95 Class<?> c = lookup.lookupClass(); 96 assertNestmate(lookup); 97 98 // invoke int test(HiddenNestmateTest o) via MethodHandle 99 MethodHandle ctor = lookup.findConstructor(c, MethodType.methodType(void.class)); 100 MethodHandle mh = lookup.findVirtual(c, "test", MethodType.methodType(int.class, HiddenNestmateTest.class)); 101 int x = (int)mh.bindTo(ctor.invoke()).invokeExact( this); 102 assertTrue(x == privMethod()); 103 104 // invoke int test(HiddenNestmateTest o) 105 int x1 = testInjectedClass(c); 106 assertTrue(x1 == privMethod()); 107 } 108 109 @Test 110 public void hiddenStrongClass() throws Throwable { 111 // define a hidden class strongly referenced by the class loader 112 Lookup lookup = MethodHandles.lookup().defineHiddenClass(bytes, false, NESTMATE, STRONG); 113 assertNestmate(lookup); 114 } 115 116 @Test(expectedExceptions = IllegalAccessException.class) 117 public void noPrivateLookupAccess() throws Throwable { 118 Lookup lookup = MethodHandles.lookup().dropLookupMode(Lookup.PRIVATE); 119 lookup.defineHiddenClass(bytes, false, NESTMATE); 120 } 121 122 public void teleportToNestmate() throws Throwable { 123 Lookup lookup = MethodHandles.lookup().defineHiddenClass(bytes, false, NESTMATE); 124 assertNestmate(lookup); 125 126 // Teleport to a hidden nestmate 127 Lookup lc = MethodHandles.lookup().in(lookup.lookupClass()); 128 assertTrue((lc.lookupModes() & PRIVATE) != 0); 129 Lookup lc2 = lc.defineHiddenClass(bytes, false, NESTMATE); 130 assertNestmate(lc2); 131 } 132 |