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
|
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
|