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 sun.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 sun.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 return javaLangInvokeAccess; 90 } 91 92 public static void setJavaLangRefAccess(JavaLangRefAccess jlra) { 93 javaLangRefAccess = jlra; 94 } 95 96 public static JavaLangRefAccess getJavaLangRefAccess() { 97 return javaLangRefAccess; 98 } 99 100 public static void setJavaNetAccess(JavaNetAccess jna) { 101 javaNetAccess = jna; 102 } 103 104 public static JavaNetAccess getJavaNetAccess() { 105 if (javaNetAccess == null) 106 unsafe.ensureClassInitialized(java.net.URLClassLoader.class); 107 return javaNetAccess; 108 } 109 110 public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) { 111 javaNetInetAddressAccess = jna; |