/* * Copyright (c) 2022, 2025, 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.classfile.constantpool; import java.lang.classfile.Attribute; import java.lang.classfile.ClassFileBuilder; import java.lang.classfile.Opcode; import java.lang.classfile.TypeKind; /** * Models an entry in the constant pool of a {@code class} file. Entries are * read from {@code class} files, and can be created with a {@link * ConstantPoolBuilder} to write to {@code class} files. * * @implNote *

Unbound Constant Pool Entries

* Implementations may create unbound constant pool entries not belonging to * an actual constant pool. They conveniently represent constant pool entries * referred by unbound {@linkplain Attribute attributes} not read from a {@code * class} file. Their {@link #index() index()} return a non-positive invalid * value, and behaviors of their {@link #constantPool() constantPool()} are * unspecified. They are considered alien to any {@linkplain * ClassFileBuilder#constantPool() contextual constant pool} and will be * converted when they are written to {@code class} files. * * @see ConstantPoolBuilder##alien Alien Constant Pool Entries * @sealedGraph * @since 24 */ public sealed interface PoolEntry permits AnnotationConstantValueEntry, DynamicConstantPoolEntry, LoadableConstantEntry, MemberRefEntry, ModuleEntry, NameAndTypeEntry, PackageEntry { /** The {@linkplain #tag tag} for {@link ClassEntry CONSTANT_Class} constant kind. */ int TAG_CLASS = 7; /** The {@linkplain #tag tag} for {@link DoubleEntry CONSTANT_Double} constant kind. */ int TAG_DOUBLE = 6; /** The {@linkplain #tag tag} for {@link ConstantDynamicEntry CONSTANT_Dynamic} constant kind. */ int TAG_DYNAMIC = 17; /** The {@linkplain #tag tag} for {@link FieldRefEntry CONSTANT_Fieldref} constant kind. */ int TAG_FIELDREF = 9; /** The {@linkplain #tag tag} for {@link FloatEntry CONSTANT_Float} constant kind. */ int TAG_FLOAT = 4; /** The {@linkplain #tag tag} for {@link IntegerEntry CONSTANT_Integer} constant kind. */ int TAG_INTEGER = 3; /** The {@linkplain #tag tag} for {@link InterfaceMethodRefEntry CONSTANT_InterfaceMethodref} constant kind. */ int TAG_INTERFACE_METHODREF = 11; /** The {@linkplain #tag tag} for {@link InvokeDynamicEntry CONSTANT_InvokeDynamic} constant kind. */ int TAG_INVOKE_DYNAMIC = 18; /** The {@linkplain #tag tag} for {@link LongEntry CONSTANT_Long} constant kind. */ int TAG_LONG = 5; /** The {@linkplain #tag tag} for {@link MethodHandleEntry CONSTANT_MethodHandle} constant kind. */ int TAG_METHOD_HANDLE = 15; /** The {@linkplain #tag tag} for {@link MethodRefEntry CONSTANT_Methodref} constant kind. */ int TAG_METHODREF = 10; /** The {@linkplain #tag tag} for {@link MethodTypeEntry CONSTANT_MethodType} constant kind. */ int TAG_METHOD_TYPE = 16; /** The {@linkplain #tag tag} for {@link ModuleEntry CONSTANT_Module} constant kind. */ int TAG_MODULE = 19; /** The {@linkplain #tag tag} for {@link NameAndTypeEntry CONSTANT_NameAndType} constant kind. */ int TAG_NAME_AND_TYPE = 12; /** The {@linkplain #tag tag} for {@link PackageEntry CONSTANT_Package} constant kind. */ int TAG_PACKAGE = 20; /** The {@linkplain #tag tag} for {@link StringEntry CONSTANT_String} constant kind. */ int TAG_STRING = 8; /** The {@linkplain #tag tag} for {@link Utf8Entry CONSTANT_Utf8} constant kind. */ int TAG_UTF8 = 1; /** * {@return the constant pool this entry is from} * * @apiNote * Given a {@link ConstantPoolBuilder} {@code builder} and a {@code * PoolEntry entry}, use {@link ConstantPoolBuilder#canWriteDirect * builder.canWriteDirect(entry.constantPool())} instead of object equality * of the constant pool to determine if an entry belongs to the builder. * * @see ##unbound Unbound Constant Pool Entries */ ConstantPool constantPool(); /** * {@return the constant pool tag that describes the type of this entry} * * @apiNote * {@code TAG_}-prefixed constants in this class, such as {@link #TAG_UTF8}, * describe the possible return values of this method. */ int tag(); /** * {@return the index within the constant pool corresponding to this entry} * A valid index is always positive; if the index is non-positive, this * entry is {@linkplain ##unbound unbound}. * * @see ##unbound Unbound Constant Pool Entries */ int index(); /** * {@return the number of constant pool slots this entry consumes} *

* All pool entries except {@link LongEntry CONSTANT_Long} and {@link * DoubleEntry CONSTANT_Double} have width {@code 1}. These two exceptions * have width {@code 2}, and their subsequent indices at {@link #index() * index() + 1} are considered unusable. * * @apiNote * If this entry is {@linkplain LoadableConstantEntry loadable}, the width * of this entry does not decide if this entry should be loaded with {@link * Opcode#LDC ldc} or {@link Opcode#LDC2_W ldc2_w}. For example, {@link * ConstantDynamicEntry} always has width {@code 1}, but it must be loaded * with {@code ldc2_w} if its {@linkplain ConstantDynamicEntry#typeKind() * type} is {@link TypeKind#LONG long} or {@link TypeKind#DOUBLE double}. * Use {@link LoadableConstantEntry#typeKind() typeKind().slotSize()} to * determine the loading instruction instead. * * @see ConstantPool##index Index in the Constant Pool */ int width(); }