/*
 * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package sun.reflect;

import java.io.OptionalDataException;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.security.AccessController;
import java.security.Permission;
import java.security.PrivilegedAction;

ReflectionFactory supports custom serialization. Its methods support the creation of uninitialized objects, invoking serialization private methods for readObject, writeObject, readResolve, and writeReplace.

ReflectionFactory access is restricted, if a security manager is active, unless the permission RuntimePermission("reflectionFactoryAccess") is granted.

/** * ReflectionFactory supports custom serialization. * Its methods support the creation of uninitialized objects, invoking serialization * private methods for readObject, writeObject, readResolve, and writeReplace. * <p> * ReflectionFactory access is restricted, if a security manager is active, * unless the permission {@code RuntimePermission("reflectionFactoryAccess")} * is granted. */
public class ReflectionFactory { private static final ReflectionFactory soleInstance = new ReflectionFactory(); private static final jdk.internal.reflect.ReflectionFactory delegate = AccessController.doPrivileged( new PrivilegedAction<jdk.internal.reflect.ReflectionFactory>() { public jdk.internal.reflect.ReflectionFactory run() { return jdk.internal.reflect.ReflectionFactory.getReflectionFactory(); } }); private ReflectionFactory() {} private static final Permission REFLECTION_FACTORY_ACCESS_PERM = new RuntimePermission("reflectionFactoryAccess");
Provides the caller with the capability to instantiate reflective objects.

First, if there is a security manager, its checkPermission method is called with a RuntimePermission with target "reflectionFactoryAccess". This may result in a security exception.

The returned ReflectionFactory object should be carefully guarded by the caller, since it can be used to read and write private data and invoke private methods, as well as to load unverified bytecodes. It must never be passed to untrusted code.

Throws:
  • SecurityException – if a security manager exists and its checkPermission method doesn't allow access to the RuntimePermission "reflectionFactoryAccess".
Returns:the ReflectionFactory
/** * Provides the caller with the capability to instantiate reflective * objects. * * <p> First, if there is a security manager, its {@code checkPermission} * method is called with a {@link java.lang.RuntimePermission} with target * {@code "reflectionFactoryAccess"}. This may result in a security * exception. * * <p> The returned {@code ReflectionFactory} object should be carefully * guarded by the caller, since it can be used to read and write private * data and invoke private methods, as well as to load unverified bytecodes. * It must never be passed to untrusted code. * * @return the ReflectionFactory * @throws SecurityException if a security manager exists and its * {@code checkPermission} method doesn't allow access to * the RuntimePermission "reflectionFactoryAccess". */
public static ReflectionFactory getReflectionFactory() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkPermission(REFLECTION_FACTORY_ACCESS_PERM); } return soleInstance; }
Returns an accessible constructor capable of creating instances of the given class, initialized by the given constructor.
Params:
  • cl – the class to instantiate
  • constructorToCall – the constructor to call
Returns:an accessible constructor
/** * Returns an accessible constructor capable of creating instances * of the given class, initialized by the given constructor. * * @param cl the class to instantiate * @param constructorToCall the constructor to call * @return an accessible constructor */
public Constructor<?> newConstructorForSerialization(Class<?> cl, Constructor<?> constructorToCall) { return delegate.newConstructorForSerialization(cl, constructorToCall); }
Returns an accessible no-arg constructor for a class. The no-arg constructor is found searching the class and its supertypes.
Params:
  • cl – the class to instantiate
Returns:a no-arg constructor for the class or null if the class or supertypes do not have a suitable no-arg constructor
/** * Returns an accessible no-arg constructor for a class. * The no-arg constructor is found searching the class and its supertypes. * * @param cl the class to instantiate * @return a no-arg constructor for the class or {@code null} if * the class or supertypes do not have a suitable no-arg constructor */
public final Constructor<?> newConstructorForSerialization(Class<?> cl) { return delegate.newConstructorForSerialization(cl); }
Returns an accessible no-arg constructor for an externalizable class to be initialized using a public no-argument constructor.
Params:
  • cl – the class to instantiate
Returns:A no-arg constructor for the class; returns null if the class does not implement Externalizable
/** * Returns an accessible no-arg constructor for an externalizable class to be * initialized using a public no-argument constructor. * * @param cl the class to instantiate * @return A no-arg constructor for the class; returns {@code null} if * the class does not implement {@link java.io.Externalizable} */
public final Constructor<?> newConstructorForExternalization(Class<?> cl) { return delegate.newConstructorForExternalization(cl); }
Returns a direct MethodHandle for the readObject method on a Serializable class. The first argument of MethodHandle.invoke is the serializable object and the second argument is the ObjectInputStream passed to readObject.
Params:
  • cl – a Serializable class
Returns: a direct MethodHandle for the readObject method of the class or null if the class does not have a readObject method
/** * Returns a direct MethodHandle for the {@code readObject} method on * a Serializable class. * The first argument of {@link MethodHandle#invoke} is the serializable * object and the second argument is the {@code ObjectInputStream} passed to * {@code readObject}. * * @param cl a Serializable class * @return a direct MethodHandle for the {@code readObject} method of the class or * {@code null} if the class does not have a {@code readObject} method */
public final MethodHandle readObjectForSerialization(Class<?> cl) { return delegate.readObjectForSerialization(cl); }
Returns a direct MethodHandle for the readObjectNoData method on a Serializable class. The first argument of MethodHandle.invoke is the serializable object and the second argument is the ObjectInputStream passed to readObjectNoData.
Params:
  • cl – a Serializable class
Returns: a direct MethodHandle for the readObjectNoData method of the class or null if the class does not have a readObjectNoData method
/** * Returns a direct MethodHandle for the {@code readObjectNoData} method on * a Serializable class. * The first argument of {@link MethodHandle#invoke} is the serializable * object and the second argument is the {@code ObjectInputStream} passed to * {@code readObjectNoData}. * * @param cl a Serializable class * @return a direct MethodHandle for the {@code readObjectNoData} method * of the class or {@code null} if the class does not have a * {@code readObjectNoData} method */
public final MethodHandle readObjectNoDataForSerialization(Class<?> cl) { return delegate.readObjectNoDataForSerialization(cl); }
Returns a direct MethodHandle for the writeObject method on a Serializable class. The first argument of MethodHandle.invoke is the serializable object and the second argument is the ObjectOutputStream passed to writeObject.
Params:
  • cl – a Serializable class
Returns: a direct MethodHandle for the writeObject method of the class or null if the class does not have a writeObject method
/** * Returns a direct MethodHandle for the {@code writeObject} method on * a Serializable class. * The first argument of {@link MethodHandle#invoke} is the serializable * object and the second argument is the {@code ObjectOutputStream} passed to * {@code writeObject}. * * @param cl a Serializable class * @return a direct MethodHandle for the {@code writeObject} method of the class or * {@code null} if the class does not have a {@code writeObject} method */
public final MethodHandle writeObjectForSerialization(Class<?> cl) { return delegate.writeObjectForSerialization(cl); }
Returns a direct MethodHandle for the readResolve method on a serializable class. The single argument of MethodHandle.invoke is the serializable object.
Params:
  • cl – the Serializable class
Returns: a direct MethodHandle for the readResolve method of the class or null if the class does not have a readResolve method
/** * Returns a direct MethodHandle for the {@code readResolve} method on * a serializable class. * The single argument of {@link MethodHandle#invoke} is the serializable * object. * * @param cl the Serializable class * @return a direct MethodHandle for the {@code readResolve} method of the class or * {@code null} if the class does not have a {@code readResolve} method */
public final MethodHandle readResolveForSerialization(Class<?> cl) { return delegate.readResolveForSerialization(cl); }
Returns a direct MethodHandle for the writeReplace method on a serializable class. The single argument of MethodHandle.invoke is the serializable object.
Params:
  • cl – the Serializable class
Returns: a direct MethodHandle for the writeReplace method of the class or null if the class does not have a writeReplace method
/** * Returns a direct MethodHandle for the {@code writeReplace} method on * a serializable class. * The single argument of {@link MethodHandle#invoke} is the serializable * object. * * @param cl the Serializable class * @return a direct MethodHandle for the {@code writeReplace} method of the class or * {@code null} if the class does not have a {@code writeReplace} method */
public final MethodHandle writeReplaceForSerialization(Class<?> cl) { return delegate.writeReplaceForSerialization(cl); }
Returns true if the class has a static initializer. The presence of a static initializer is used to compute the serialVersionUID.
Params:
  • cl – a serializable class
Returns:true if the class has a static initializer, otherwise false
/** * Returns true if the class has a static initializer. * The presence of a static initializer is used to compute the serialVersionUID. * @param cl a serializable class * @return {@code true} if the class has a static initializer, * otherwise {@code false} */
public final boolean hasStaticInitializerForSerialization(Class<?> cl) { return delegate.hasStaticInitializerForSerialization(cl); }
Returns a new OptionalDataException with eof set to true or false.
Params:
  • bool – the value of eof in the created OptionalDataException
Returns: a new OptionalDataException
/** * Returns a new OptionalDataException with {@code eof} set to {@code true} * or {@code false}. * @param bool the value of {@code eof} in the created OptionalDataException * @return a new OptionalDataException */
public final OptionalDataException newOptionalDataExceptionForSerialization(boolean bool) { Constructor<OptionalDataException> cons = delegate.newOptionalDataExceptionForSerialization(); try { return cons.newInstance(bool); } catch (InstantiationException|IllegalAccessException|InvocationTargetException ex) { throw new InternalError("unable to create OptionalDataException", ex); } } }