33 import java.io.Console; 34 import java.io.FileDescriptor; 35 import java.io.FilePermission; 36 import java.io.ObjectInputStream; 37 import java.io.RandomAccessFile; 38 import java.security.ProtectionDomain; 39 import java.security.Signature; 40 import jdk.internal.misc.Unsafe; 41 42 /** A repository of "shared secrets", which are a mechanism for 43 calling implementation-private methods in another package without 44 using reflection. A package-private class implements a public 45 interface and provides the ability to call package-private methods 46 within that package; the object implementing that interface is 47 provided through a third package to which access is restricted. 48 This framework avoids the primary disadvantage of using reflection 49 for this purpose, namely the loss of compile-time checking. */ 50 51 public class SharedSecrets { 52 private static final Unsafe unsafe = Unsafe.getUnsafe(); 53 private static JavaUtilJarAccess javaUtilJarAccess; 54 private static JavaLangAccess javaLangAccess; 55 private static JavaLangModuleAccess javaLangModuleAccess; 56 private static JavaLangInvokeAccess javaLangInvokeAccess; 57 private static JavaLangRefAccess javaLangRefAccess; 58 private static JavaIOAccess javaIOAccess; 59 private static JavaNetInetAddressAccess javaNetInetAddressAccess; 60 private static JavaNetHttpCookieAccess javaNetHttpCookieAccess; 61 private static JavaNetUriAccess javaNetUriAccess; 62 private static JavaNetURLAccess javaNetURLAccess; 63 private static JavaNioAccess javaNioAccess; 64 private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess; 65 private static JavaIOFilePermissionAccess javaIOFilePermissionAccess; 66 private static JavaSecurityAccess javaSecurityAccess; 67 private static JavaUtilZipFileAccess javaUtilZipFileAccess; 68 private static JavaUtilResourceBundleAccess javaUtilResourceBundleAccess; 69 private static JavaAWTAccess javaAWTAccess; 70 private static JavaAWTFontAccess javaAWTFontAccess; 71 private static JavaBeansAccess javaBeansAccess; 72 private static JavaObjectInputStreamAccess javaObjectInputStreamAccess; 73 private static JavaObjectInputFilterAccess javaObjectInputFilterAccess; 74 private static JavaIORandomAccessFileAccess javaIORandomAccessFileAccess; 75 private static JavaSecuritySignatureAccess javaSecuritySignatureAccess; 76 private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess; 77 78 public static JavaUtilJarAccess javaUtilJarAccess() { 79 if (javaUtilJarAccess == null) { 80 // Ensure JarFile is initialized; we know that this class 81 // provides the shared secret 82 unsafe.ensureClassInitialized(JarFile.class); 83 } 84 return javaUtilJarAccess; 85 } 86 87 public static void setJavaUtilJarAccess(JavaUtilJarAccess access) { 88 javaUtilJarAccess = access; 89 } 90 91 public static void setJavaLangAccess(JavaLangAccess jla) { 92 javaLangAccess = jla; 93 } 94 112 113 public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) { 114 javaLangModuleAccess = jlrma; 115 } 116 117 public static JavaLangModuleAccess getJavaLangModuleAccess() { 118 if (javaLangModuleAccess == null) { 119 unsafe.ensureClassInitialized(ModuleDescriptor.class); 120 } 121 return javaLangModuleAccess; 122 } 123 124 public static void setJavaLangRefAccess(JavaLangRefAccess jlra) { 125 javaLangRefAccess = jlra; 126 } 127 128 public static JavaLangRefAccess getJavaLangRefAccess() { 129 return javaLangRefAccess; 130 } 131 132 public static void setJavaNetUriAccess(JavaNetUriAccess jnua) { 133 javaNetUriAccess = jnua; 134 } 135 136 public static JavaNetUriAccess getJavaNetUriAccess() { 137 if (javaNetUriAccess == null) 138 unsafe.ensureClassInitialized(java.net.URI.class); 139 return javaNetUriAccess; 140 } 141 142 public static void setJavaNetURLAccess(JavaNetURLAccess jnua) { 143 javaNetURLAccess = jnua; 144 } 145 146 public static JavaNetURLAccess getJavaNetURLAccess() { 147 if (javaNetURLAccess == null) 148 unsafe.ensureClassInitialized(java.net.URL.class); 149 return javaNetURLAccess; 150 } 151 | 33 import java.io.Console; 34 import java.io.FileDescriptor; 35 import java.io.FilePermission; 36 import java.io.ObjectInputStream; 37 import java.io.RandomAccessFile; 38 import java.security.ProtectionDomain; 39 import java.security.Signature; 40 import jdk.internal.misc.Unsafe; 41 42 /** A repository of "shared secrets", which are a mechanism for 43 calling implementation-private methods in another package without 44 using reflection. A package-private class implements a public 45 interface and provides the ability to call package-private methods 46 within that package; the object implementing that interface is 47 provided through a third package to which access is restricted. 48 This framework avoids the primary disadvantage of using reflection 49 for this purpose, namely the loss of compile-time checking. */ 50 51 public class SharedSecrets { 52 private static final Unsafe unsafe = Unsafe.getUnsafe(); 53 private static JavaAWTAccess javaAWTAccess; 54 private static JavaAWTFontAccess javaAWTFontAccess; 55 private static JavaBeansAccess javaBeansAccess; 56 private static JavaLangAccess javaLangAccess; 57 private static JavaLangInvokeAccess javaLangInvokeAccess; 58 private static JavaLangModuleAccess javaLangModuleAccess; 59 private static JavaLangRefAccess javaLangRefAccess; 60 private static JavaLangReflectAccess javaLangReflectAccess; 61 private static JavaIOAccess javaIOAccess; 62 private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess; 63 private static JavaIOFilePermissionAccess javaIOFilePermissionAccess; 64 private static JavaIORandomAccessFileAccess javaIORandomAccessFileAccess; 65 private static JavaObjectInputStreamAccess javaObjectInputStreamAccess; 66 private static JavaObjectInputFilterAccess javaObjectInputFilterAccess; 67 private static JavaNetInetAddressAccess javaNetInetAddressAccess; 68 private static JavaNetHttpCookieAccess javaNetHttpCookieAccess; 69 private static JavaNetUriAccess javaNetUriAccess; 70 private static JavaNetURLAccess javaNetURLAccess; 71 private static JavaNioAccess javaNioAccess; 72 private static JavaUtilJarAccess javaUtilJarAccess; 73 private static JavaUtilZipFileAccess javaUtilZipFileAccess; 74 private static JavaUtilResourceBundleAccess javaUtilResourceBundleAccess; 75 private static JavaSecurityAccess javaSecurityAccess; 76 private static JavaSecuritySignatureAccess javaSecuritySignatureAccess; 77 private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess; 78 79 public static JavaUtilJarAccess javaUtilJarAccess() { 80 if (javaUtilJarAccess == null) { 81 // Ensure JarFile is initialized; we know that this class 82 // provides the shared secret 83 unsafe.ensureClassInitialized(JarFile.class); 84 } 85 return javaUtilJarAccess; 86 } 87 88 public static void setJavaUtilJarAccess(JavaUtilJarAccess access) { 89 javaUtilJarAccess = access; 90 } 91 92 public static void setJavaLangAccess(JavaLangAccess jla) { 93 javaLangAccess = jla; 94 } 95 113 114 public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) { 115 javaLangModuleAccess = jlrma; 116 } 117 118 public static JavaLangModuleAccess getJavaLangModuleAccess() { 119 if (javaLangModuleAccess == null) { 120 unsafe.ensureClassInitialized(ModuleDescriptor.class); 121 } 122 return javaLangModuleAccess; 123 } 124 125 public static void setJavaLangRefAccess(JavaLangRefAccess jlra) { 126 javaLangRefAccess = jlra; 127 } 128 129 public static JavaLangRefAccess getJavaLangRefAccess() { 130 return javaLangRefAccess; 131 } 132 133 public static void setJavaLangReflectAccess(JavaLangReflectAccess jlra) { 134 javaLangReflectAccess = jlra; 135 } 136 137 public static JavaLangReflectAccess getJavaLangReflectAccess() { 138 return javaLangReflectAccess; 139 } 140 141 public static void setJavaNetUriAccess(JavaNetUriAccess jnua) { 142 javaNetUriAccess = jnua; 143 } 144 145 public static JavaNetUriAccess getJavaNetUriAccess() { 146 if (javaNetUriAccess == null) 147 unsafe.ensureClassInitialized(java.net.URI.class); 148 return javaNetUriAccess; 149 } 150 151 public static void setJavaNetURLAccess(JavaNetURLAccess jnua) { 152 javaNetURLAccess = jnua; 153 } 154 155 public static JavaNetURLAccess getJavaNetURLAccess() { 156 if (javaNetURLAccess == null) 157 unsafe.ensureClassInitialized(java.net.URL.class); 158 return javaNetURLAccess; 159 } 160 |