28
28
*/
29
29
final class HiddenClassDefiner implements ClassDefiner {
30
30
31
- private static final sun . misc . Unsafe THE_UNSAFE ;
32
- private static final Object TRUSTED_LOOKUP_BASE ;
33
- private static final long TRUSTED_LOOKUP_OFFSET ;
31
+ private static final Object THE_UNSAFE ;
32
+ private static final Object TRUSTED_LOOKUP_OFFSET ;
33
+ private static final Method GET_OBJECT_METHOD ;
34
34
private static final Object HIDDEN_CLASS_OPTIONS ;
35
35
private static final Method HIDDEN_DEFINE_METHOD ;
36
36
37
37
static {
38
38
try {
39
- THE_UNSAFE = UnsafeGetter .getUnsafe ();
39
+ Class <?> unsafeType = Class .forName ("sun.misc.Unsafe" );
40
+ Field theUnsafeField = unsafeType .getDeclaredField ("theUnsafe" );
41
+ theUnsafeField .setAccessible (true );
42
+ THE_UNSAFE = theUnsafeField .get (null );
40
43
Field trustedLookupField = Lookup .class .getDeclaredField ("IMPL_LOOKUP" );
41
- TRUSTED_LOOKUP_BASE = THE_UNSAFE .staticFieldBase (trustedLookupField );
42
- TRUSTED_LOOKUP_OFFSET = THE_UNSAFE .staticFieldOffset (trustedLookupField );
44
+ Method offsetMethod = unsafeType .getMethod ("staticFieldOffset" , Field .class );
45
+ TRUSTED_LOOKUP_OFFSET = offsetMethod .invoke (THE_UNSAFE , trustedLookupField );
46
+ GET_OBJECT_METHOD = unsafeType .getMethod ("getObject" , Object .class , long .class );
43
47
HIDDEN_CLASS_OPTIONS = classOptions ("NESTMATE" );
44
48
HIDDEN_DEFINE_METHOD =
45
49
Lookup .class .getMethod (
@@ -52,7 +56,7 @@ final class HiddenClassDefiner implements ClassDefiner {
52
56
@ Override
53
57
public Class <?> define (Class <?> hostClass , byte [] bytecode ) throws Exception {
54
58
Lookup trustedLookup =
55
- (Lookup ) THE_UNSAFE . getObject ( TRUSTED_LOOKUP_BASE , TRUSTED_LOOKUP_OFFSET );
59
+ (Lookup ) GET_OBJECT_METHOD . invoke ( THE_UNSAFE , Lookup . class , TRUSTED_LOOKUP_OFFSET );
56
60
Lookup definedLookup =
57
61
(Lookup )
58
62
HIDDEN_DEFINE_METHOD .invoke (
0 commit comments