Path: blob/master/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java
41159 views
/*1* Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package jdk.internal.access;2627import javax.crypto.SealedObject;28import javax.crypto.spec.SecretKeySpec;29import java.io.ObjectInputFilter;30import java.lang.invoke.MethodHandles;31import java.lang.module.ModuleDescriptor;32import java.security.spec.EncodedKeySpec;33import java.util.ResourceBundle;34import java.util.jar.JarFile;35import java.io.Console;36import java.io.FileDescriptor;37import java.io.FilePermission;38import java.io.ObjectInputStream;39import java.io.RandomAccessFile;40import java.security.ProtectionDomain;41import java.security.Signature;4243/** A repository of "shared secrets", which are a mechanism for44calling implementation-private methods in another package without45using reflection. A package-private class implements a public46interface and provides the ability to call package-private methods47within that package; the object implementing that interface is48provided through a third package to which access is restricted.49This framework avoids the primary disadvantage of using reflection50for this purpose, namely the loss of compile-time checking. */5152public class SharedSecrets {53private static final MethodHandles.Lookup lookup = MethodHandles.lookup();54private static JavaAWTAccess javaAWTAccess;55private static JavaAWTFontAccess javaAWTFontAccess;56private static JavaBeansAccess javaBeansAccess;57private static JavaLangAccess javaLangAccess;58private static JavaLangInvokeAccess javaLangInvokeAccess;59private static JavaLangModuleAccess javaLangModuleAccess;60private static JavaLangRefAccess javaLangRefAccess;61private static JavaLangReflectAccess javaLangReflectAccess;62private static JavaIOAccess javaIOAccess;63private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;64private static JavaIOFilePermissionAccess javaIOFilePermissionAccess;65private static JavaIORandomAccessFileAccess javaIORandomAccessFileAccess;66private static JavaObjectInputStreamReadString javaObjectInputStreamReadString;67private static JavaObjectInputStreamAccess javaObjectInputStreamAccess;68private static JavaObjectInputFilterAccess javaObjectInputFilterAccess;69private static JavaNetInetAddressAccess javaNetInetAddressAccess;70private static JavaNetHttpCookieAccess javaNetHttpCookieAccess;71private static JavaNetUriAccess javaNetUriAccess;72private static JavaNetURLAccess javaNetURLAccess;73private static JavaNioAccess javaNioAccess;74private static JavaUtilCollectionAccess javaUtilCollectionAccess;75private static JavaUtilJarAccess javaUtilJarAccess;76private static JavaUtilZipFileAccess javaUtilZipFileAccess;77private static JavaUtilResourceBundleAccess javaUtilResourceBundleAccess;78private static JavaSecurityAccess javaSecurityAccess;79private static JavaSecuritySignatureAccess javaSecuritySignatureAccess;80private static JavaSecuritySpecAccess javaSecuritySpecAccess;81private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess;82private static JavaxCryptoSpecAccess javaxCryptoSpecAccess;8384public static void setJavaUtilCollectionAccess(JavaUtilCollectionAccess juca) {85javaUtilCollectionAccess = juca;86}8788public static JavaUtilCollectionAccess getJavaUtilCollectionAccess() {89var access = javaUtilCollectionAccess;90if (access == null) {91try {92Class.forName("java.util.ImmutableCollections$Access", true, null);93access = javaUtilCollectionAccess;94} catch (ClassNotFoundException e) {}95}96return access;97}9899public static JavaUtilJarAccess javaUtilJarAccess() {100var access = javaUtilJarAccess;101if (access == null) {102// Ensure JarFile is initialized; we know that this class103// provides the shared secret104ensureClassInitialized(JarFile.class);105access = javaUtilJarAccess;106}107return access;108}109110public static void setJavaUtilJarAccess(JavaUtilJarAccess access) {111javaUtilJarAccess = access;112}113114public static void setJavaLangAccess(JavaLangAccess jla) {115javaLangAccess = jla;116}117118public static JavaLangAccess getJavaLangAccess() {119return javaLangAccess;120}121122public static void setJavaLangInvokeAccess(JavaLangInvokeAccess jlia) {123javaLangInvokeAccess = jlia;124}125126public static JavaLangInvokeAccess getJavaLangInvokeAccess() {127var access = javaLangInvokeAccess;128if (access == null) {129try {130Class.forName("java.lang.invoke.MethodHandleImpl", true, null);131access = javaLangInvokeAccess;132} catch (ClassNotFoundException e) {}133}134return access;135}136137public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) {138javaLangModuleAccess = jlrma;139}140141public static JavaLangModuleAccess getJavaLangModuleAccess() {142var access = javaLangModuleAccess;143if (access == null) {144ensureClassInitialized(ModuleDescriptor.class);145access = javaLangModuleAccess;146}147return access;148}149150public static void setJavaLangRefAccess(JavaLangRefAccess jlra) {151javaLangRefAccess = jlra;152}153154public static JavaLangRefAccess getJavaLangRefAccess() {155return javaLangRefAccess;156}157158public static void setJavaLangReflectAccess(JavaLangReflectAccess jlra) {159javaLangReflectAccess = jlra;160}161162public static JavaLangReflectAccess getJavaLangReflectAccess() {163return javaLangReflectAccess;164}165166public static void setJavaNetUriAccess(JavaNetUriAccess jnua) {167javaNetUriAccess = jnua;168}169170public static JavaNetUriAccess getJavaNetUriAccess() {171var access = javaNetUriAccess;172if (access == null) {173ensureClassInitialized(java.net.URI.class);174access = javaNetUriAccess;175}176return access;177}178179public static void setJavaNetURLAccess(JavaNetURLAccess jnua) {180javaNetURLAccess = jnua;181}182183public static JavaNetURLAccess getJavaNetURLAccess() {184var access = javaNetURLAccess;185if (access == null) {186ensureClassInitialized(java.net.URL.class);187access = javaNetURLAccess;188}189return access;190}191192public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) {193javaNetInetAddressAccess = jna;194}195196public static JavaNetInetAddressAccess getJavaNetInetAddressAccess() {197var access = javaNetInetAddressAccess;198if (access == null) {199ensureClassInitialized(java.net.InetAddress.class);200access = javaNetInetAddressAccess;201}202return access;203}204205public static void setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a) {206javaNetHttpCookieAccess = a;207}208209public static JavaNetHttpCookieAccess getJavaNetHttpCookieAccess() {210var access = javaNetHttpCookieAccess;211if (access == null) {212ensureClassInitialized(java.net.HttpCookie.class);213access = javaNetHttpCookieAccess;214}215return access;216}217218public static void setJavaNioAccess(JavaNioAccess jna) {219javaNioAccess = jna;220}221222public static JavaNioAccess getJavaNioAccess() {223var access = javaNioAccess;224if (access == null) {225// Ensure java.nio.Buffer is initialized, which provides the226// shared secret.227ensureClassInitialized(java.nio.Buffer.class);228access = javaNioAccess;229}230return access;231}232233public static void setJavaIOAccess(JavaIOAccess jia) {234javaIOAccess = jia;235}236237public static JavaIOAccess getJavaIOAccess() {238var access = javaIOAccess;239if (access == null) {240ensureClassInitialized(Console.class);241access = javaIOAccess;242}243return access;244}245246public static void setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda) {247javaIOFileDescriptorAccess = jiofda;248}249250public static JavaIOFilePermissionAccess getJavaIOFilePermissionAccess() {251var access = javaIOFilePermissionAccess;252if (access == null) {253ensureClassInitialized(FilePermission.class);254access = javaIOFilePermissionAccess;255}256return access;257}258259public static void setJavaIOFilePermissionAccess(JavaIOFilePermissionAccess jiofpa) {260javaIOFilePermissionAccess = jiofpa;261}262263public static JavaIOFileDescriptorAccess getJavaIOFileDescriptorAccess() {264var access = javaIOFileDescriptorAccess;265if (access == null) {266ensureClassInitialized(FileDescriptor.class);267access = javaIOFileDescriptorAccess;268}269return access;270}271272public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {273javaSecurityAccess = jsa;274}275276public static JavaSecurityAccess getJavaSecurityAccess() {277var access = javaSecurityAccess;278if (access == null) {279ensureClassInitialized(ProtectionDomain.class);280access = javaSecurityAccess;281}282return access;283}284285public static JavaUtilZipFileAccess getJavaUtilZipFileAccess() {286var access = javaUtilZipFileAccess;287if (access == null) {288ensureClassInitialized(java.util.zip.ZipFile.class);289access = javaUtilZipFileAccess;290}291return access;292}293294public static void setJavaUtilZipFileAccess(JavaUtilZipFileAccess access) {295javaUtilZipFileAccess = access;296}297298public static void setJavaAWTAccess(JavaAWTAccess jaa) {299javaAWTAccess = jaa;300}301302public static JavaAWTAccess getJavaAWTAccess() {303// this may return null in which case calling code needs to304// provision for.305return javaAWTAccess;306}307308public static void setJavaAWTFontAccess(JavaAWTFontAccess jafa) {309javaAWTFontAccess = jafa;310}311312public static JavaAWTFontAccess getJavaAWTFontAccess() {313// this may return null in which case calling code needs to314// provision for.315return javaAWTFontAccess;316}317318public static JavaBeansAccess getJavaBeansAccess() {319return javaBeansAccess;320}321322public static void setJavaBeansAccess(JavaBeansAccess access) {323javaBeansAccess = access;324}325326public static JavaUtilResourceBundleAccess getJavaUtilResourceBundleAccess() {327var access = javaUtilResourceBundleAccess;328if (access == null) {329ensureClassInitialized(ResourceBundle.class);330access = javaUtilResourceBundleAccess;331}332return access;333}334335public static void setJavaUtilResourceBundleAccess(JavaUtilResourceBundleAccess access) {336javaUtilResourceBundleAccess = access;337}338339public static JavaObjectInputStreamReadString getJavaObjectInputStreamReadString() {340var access = javaObjectInputStreamReadString;341if (access == null) {342ensureClassInitialized(ObjectInputStream.class);343access = javaObjectInputStreamReadString;344}345return access;346}347348public static void setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access) {349javaObjectInputStreamReadString = access;350}351352public static JavaObjectInputStreamAccess getJavaObjectInputStreamAccess() {353var access = javaObjectInputStreamAccess;354if (access == null) {355ensureClassInitialized(ObjectInputStream.class);356access = javaObjectInputStreamAccess;357}358return access;359}360361public static void setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access) {362javaObjectInputStreamAccess = access;363}364365public static JavaObjectInputFilterAccess getJavaObjectInputFilterAccess() {366var access = javaObjectInputFilterAccess;367if (access == null) {368ensureClassInitialized(ObjectInputFilter.Config.class);369access = javaObjectInputFilterAccess;370}371return access;372}373374public static void setJavaObjectInputFilterAccess(JavaObjectInputFilterAccess access) {375javaObjectInputFilterAccess = access;376}377378public static void setJavaIORandomAccessFileAccess(JavaIORandomAccessFileAccess jirafa) {379javaIORandomAccessFileAccess = jirafa;380}381382public static JavaIORandomAccessFileAccess getJavaIORandomAccessFileAccess() {383var access = javaIORandomAccessFileAccess;384if (access == null) {385ensureClassInitialized(RandomAccessFile.class);386access = javaIORandomAccessFileAccess;387}388return access;389}390391public static void setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa) {392javaSecuritySignatureAccess = jssa;393}394395public static JavaSecuritySignatureAccess getJavaSecuritySignatureAccess() {396var access = javaSecuritySignatureAccess;397if (access == null) {398ensureClassInitialized(Signature.class);399access = javaSecuritySignatureAccess;400}401return access;402}403404public static void setJavaSecuritySpecAccess(JavaSecuritySpecAccess jssa) {405javaSecuritySpecAccess = jssa;406}407408public static JavaSecuritySpecAccess getJavaSecuritySpecAccess() {409if (javaSecuritySpecAccess == null) {410ensureClassInitialized(EncodedKeySpec.class);411}412return javaSecuritySpecAccess;413}414415public static void setJavaxCryptoSpecAccess(JavaxCryptoSpecAccess jcsa) {416javaxCryptoSpecAccess = jcsa;417}418419public static JavaxCryptoSpecAccess getJavaxCryptoSpecAccess() {420if (javaxCryptoSpecAccess == null) {421ensureClassInitialized(SecretKeySpec.class);422}423return javaxCryptoSpecAccess;424}425426public static void setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa) {427javaxCryptoSealedObjectAccess = jcsoa;428}429430public static JavaxCryptoSealedObjectAccess getJavaxCryptoSealedObjectAccess() {431var access = javaxCryptoSealedObjectAccess;432if (access == null) {433ensureClassInitialized(SealedObject.class);434access = javaxCryptoSealedObjectAccess;435}436return access;437}438439private static void ensureClassInitialized(Class<?> c) {440try {441MethodHandles.lookup().ensureInitialized(c);442} catch (IllegalAccessException e) {}443}444}445446447