28 import java.util.jar.JarFile; 29 import java.io.Console; 30 import java.io.FileDescriptor; 31 import java.security.ProtectionDomain; 32 import java.security.AccessController; 33 import jdk.internal.misc.Unsafe; 34 35 /** A repository of "shared secrets", which are a mechanism for 36 calling implementation-private methods in another package without 37 using reflection. A package-private class implements a public 38 interface and provides the ability to call package-private methods 39 within that package; the object implementing that interface is 40 provided through a third package to which access is restricted. 41 This framework avoids the primary disadvantage of using reflection 42 for this purpose, namely the loss of compile-time checking. */ 43 44 public class SharedSecrets { 45 private static final Unsafe unsafe = Unsafe.getUnsafe(); 46 private static JavaUtilJarAccess javaUtilJarAccess; 47 private static JavaLangAccess javaLangAccess; 48 private static JavaLangRefAccess javaLangRefAccess; 49 private static JavaIOAccess javaIOAccess; 50 private static JavaNetAccess javaNetAccess; 51 private static JavaNetInetAddressAccess javaNetInetAddressAccess; 52 private static JavaNetHttpCookieAccess javaNetHttpCookieAccess; 53 private static JavaNioAccess javaNioAccess; 54 private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess; 55 private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess; 56 private static JavaSecurityAccess javaSecurityAccess; 57 private static JavaUtilZipFileAccess javaUtilZipFileAccess; 58 private static JavaAWTAccess javaAWTAccess; 59 private static JavaAWTFontAccess javaAWTFontAccess; 60 private static JavaBeansAccess javaBeansAccess; 61 62 public static JavaUtilJarAccess javaUtilJarAccess() { 63 if (javaUtilJarAccess == null) { 64 // Ensure JarFile is initialized; we know that that class 65 // provides the shared secret 66 unsafe.ensureClassInitialized(JarFile.class); 67 } 68 return javaUtilJarAccess; 69 } 70 71 public static void setJavaUtilJarAccess(JavaUtilJarAccess access) { 72 javaUtilJarAccess = access; 73 } 74 75 public static void setJavaLangAccess(JavaLangAccess jla) { 76 javaLangAccess = jla; 77 } 78 79 public static JavaLangAccess getJavaLangAccess() { 80 return javaLangAccess; 81 } 82 83 public static void setJavaLangRefAccess(JavaLangRefAccess jlra) { 84 javaLangRefAccess = jlra; 85 } 86 87 public static JavaLangRefAccess getJavaLangRefAccess() { 88 return javaLangRefAccess; 89 } 90 91 public static void setJavaNetAccess(JavaNetAccess jna) { 92 javaNetAccess = jna; 93 } 94 95 public static JavaNetAccess getJavaNetAccess() { 96 if (javaNetAccess == null) 97 unsafe.ensureClassInitialized(java.net.URLClassLoader.class); 98 return javaNetAccess; 99 } 100 101 public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) { 102 javaNetInetAddressAccess = jna; | 28 import java.util.jar.JarFile; 29 import java.io.Console; 30 import java.io.FileDescriptor; 31 import java.security.ProtectionDomain; 32 import java.security.AccessController; 33 import jdk.internal.misc.Unsafe; 34 35 /** A repository of "shared secrets", which are a mechanism for 36 calling implementation-private methods in another package without 37 using reflection. A package-private class implements a public 38 interface and provides the ability to call package-private methods 39 within that package; the object implementing that interface is 40 provided through a third package to which access is restricted. 41 This framework avoids the primary disadvantage of using reflection 42 for this purpose, namely the loss of compile-time checking. */ 43 44 public class SharedSecrets { 45 private static final Unsafe unsafe = Unsafe.getUnsafe(); 46 private static JavaUtilJarAccess javaUtilJarAccess; 47 private static JavaLangAccess javaLangAccess; 48 private static JavaLangInvokeAccess javaLangInvokeAccess; 49 private static JavaLangRefAccess javaLangRefAccess; 50 private static JavaIOAccess javaIOAccess; 51 private static JavaNetAccess javaNetAccess; 52 private static JavaNetInetAddressAccess javaNetInetAddressAccess; 53 private static JavaNetHttpCookieAccess javaNetHttpCookieAccess; 54 private static JavaNioAccess javaNioAccess; 55 private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess; 56 private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess; 57 private static JavaSecurityAccess javaSecurityAccess; 58 private static JavaUtilZipFileAccess javaUtilZipFileAccess; 59 private static JavaAWTAccess javaAWTAccess; 60 private static JavaAWTFontAccess javaAWTFontAccess; 61 private static JavaBeansAccess javaBeansAccess; 62 63 public static JavaUtilJarAccess javaUtilJarAccess() { 64 if (javaUtilJarAccess == null) { 65 // Ensure JarFile is initialized; we know that that class 66 // provides the shared secret 67 unsafe.ensureClassInitialized(JarFile.class); 68 } 69 return javaUtilJarAccess; 70 } 71 72 public static void setJavaUtilJarAccess(JavaUtilJarAccess access) { 73 javaUtilJarAccess = access; 74 } 75 76 public static void setJavaLangAccess(JavaLangAccess jla) { 77 javaLangAccess = jla; 78 } 79 80 public static JavaLangAccess getJavaLangAccess() { 81 return javaLangAccess; 82 } 83 84 public static void setJavaLangInvokeAccess(JavaLangInvokeAccess jlia) { 85 javaLangInvokeAccess = jlia; 86 } 87 88 public static JavaLangInvokeAccess getJavaLangInvokeAccess() { 89 if (javaLangInvokeAccess == null) { 90 try { 91 Class<?> c = Class.forName("java.lang.invoke.MemberName"); 92 unsafe.ensureClassInitialized(c); 93 } catch (ClassNotFoundException e) {}; 94 } 95 return javaLangInvokeAccess; 96 } 97 98 public static void setJavaLangRefAccess(JavaLangRefAccess jlra) { 99 javaLangRefAccess = jlra; 100 } 101 102 public static JavaLangRefAccess getJavaLangRefAccess() { 103 return javaLangRefAccess; 104 } 105 106 public static void setJavaNetAccess(JavaNetAccess jna) { 107 javaNetAccess = jna; 108 } 109 110 public static JavaNetAccess getJavaNetAccess() { 111 if (javaNetAccess == null) 112 unsafe.ensureClassInitialized(java.net.URLClassLoader.class); 113 return javaNetAccess; 114 } 115 116 public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) { 117 javaNetInetAddressAccess = jna; |