| /* | |
| * Copyright (c) 2018, 2022, 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 java.lang.constant; | |
| import java.lang.invoke.MethodHandle; | |
| import java.lang.invoke.MethodType; | |
| import java.lang.invoke.VarHandle; | |
| import java.util.Optional; | |
| /** | |
| * Represents a type which is <em>constable</em>. A constable type is one whose | |
| * values are constants that can be represented in the constant pool of a Java | |
| * classfile as described in JVMS {@jvms 4.4}, and whose instances can describe themselves | |
| * nominally as a {@link ConstantDesc}. | |
| * | |
| * <p>Some constable types have a native representation in the constant pool: | |
| * {@link String}, {@link Integer}, {@link Long}, {@link Float}, | |
| * {@link Double}, {@link Class}, {@link MethodType}, and {@link MethodHandle}. | |
| * The types {@link String}, {@link Integer}, {@link Long}, {@link Float}, | |
| * and {@link Double} serve as their own nominal descriptors; {@link Class}, | |
| * {@link MethodType}, and {@link MethodHandle} have corresponding nominal | |
| * descriptors {@link ClassDesc}, {@link MethodTypeDesc}, and {@link MethodHandleDesc}. | |
| * | |
| * <p>Other reference types can be constable if their instances can describe | |
| * themselves in nominal form as a {@link ConstantDesc}. Examples in the Java SE | |
| * Platform API are types that support Java language features such as {@link Enum}, | |
| * and runtime support classes such as {@link VarHandle}. These are typically | |
| * described with a {@link DynamicConstantDesc}, which describes dynamically | |
| * generated constants (JVMS {@jvms 4.4.10}). | |
| * | |
| * <p>The nominal form of an instance of a constable type is obtained via | |
| * {@link #describeConstable()}. A {@linkplain Constable} need | |
| * not be able to (or may choose not to) describe all its instances in the form of | |
| * a {@link ConstantDesc}; this method returns an {@link Optional} that can be | |
| * empty to indicate that a nominal descriptor could not be created for an instance. | |
| * (For example, {@link MethodHandle} will produce nominal descriptors for direct | |
| * method handles, but not necessarily those produced by method handle | |
| * combinators.) | |
| * @jvms 4.4 The Constant Pool | |
| * @jvms 4.4.10 The {@code CONSTANT_Dynamic_info} and {@code CONSTANT_InvokeDynamic_info} Structures | |
| * | |
| * @since 12 | |
| */ | |
| public interface Constable { | |
| /** | |
| * Returns an {@link Optional} containing the nominal descriptor for this | |
| * instance, if one can be constructed, or an empty {@link Optional} | |
| * if one cannot be constructed. | |
| * | |
| * @return An {@link Optional} containing the resulting nominal descriptor, | |
| * or an empty {@link Optional} if one cannot be constructed. | |
| */ | |
| Optional<? extends ConstantDesc> describeConstable(); | |
| } |