1 /*
2 * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package java.lang.classfile;
26
27 import java.lang.classfile.AttributeMapper.AttributeStability;
28 import java.lang.classfile.attribute.*;
29
30 import jdk.internal.classfile.impl.AbstractAttributeMapper.*;
31 import jdk.internal.javac.PreviewFeature;
32
33 /**
34 * Attribute mappers for predefined (JVMS {@jvms 4.7}) and JDK-specific
35 * nonstandard attributes.
36 * <p>
37 * Unless otherwise specified, each mapper returned by methods in this class:
38 * <ul>
39 * <li>is predefined in the JVMS instead of JDK-specific;
40 * <li>does not permit {@linkplain AttributeMapper#allowMultiple() multiple
41 * attribute instances} in the same structure;
42 * <li>the attribute has a {@linkplain AttributeMapper#stability() data
43 * dependency} on the {@linkplain AttributeStability#CP_REFS constant pool}.
44 * </ul>
45 *
46 * @see AttributeMapper
47 * @see java.lang.classfile.attribute
48 * @since 24
49 */
50 public final class Attributes {
51
52 /** AnnotationDefault */
53 public static final String NAME_ANNOTATION_DEFAULT = "AnnotationDefault";
54
55 /** BootstrapMethods */
56 public static final String NAME_BOOTSTRAP_METHODS = "BootstrapMethods";
57
58 /** CharacterRangeTable */
59 public static final String NAME_CHARACTER_RANGE_TABLE = "CharacterRangeTable";
60
61 /** Code */
62 public static final String NAME_CODE = "Code";
63
64 /** CompilationID */
65 public static final String NAME_COMPILATION_ID = "CompilationID";
66
67 /** ConstantValue */
68 public static final String NAME_CONSTANT_VALUE = "ConstantValue";
69
70 /** Deprecated */
71 public static final String NAME_DEPRECATED = "Deprecated";
72
73 /** EnclosingMethod */
74 public static final String NAME_ENCLOSING_METHOD = "EnclosingMethod";
75
76 /** Exceptions */
77 public static final String NAME_EXCEPTIONS = "Exceptions";
78
79 /** InnerClasses */
80 public static final String NAME_INNER_CLASSES = "InnerClasses";
81
82 /** LineNumberTable */
83 public static final String NAME_LINE_NUMBER_TABLE = "LineNumberTable";
84
85 /** LoadableDescriptors */
86 public static final String NAME_LOADABLE_DESCRIPTORS = "LoadableDescriptors";
87
88 /** LocalVariableTable */
89 public static final String NAME_LOCAL_VARIABLE_TABLE = "LocalVariableTable";
90
91 /** LocalVariableTypeTable */
92 public static final String NAME_LOCAL_VARIABLE_TYPE_TABLE = "LocalVariableTypeTable";
93
94 /** MethodParameters */
95 public static final String NAME_METHOD_PARAMETERS = "MethodParameters";
96
97 /** Module */
98 public static final String NAME_MODULE = "Module";
99
100 /** ModuleHashes */
101 public static final String NAME_MODULE_HASHES = "ModuleHashes";
102
103 /** ModuleMainClass */
104 public static final String NAME_MODULE_MAIN_CLASS = "ModuleMainClass";
105
106 /** ModulePackages */
107 public static final String NAME_MODULE_PACKAGES = "ModulePackages";
108
109 /** ModuleResolution */
110 public static final String NAME_MODULE_RESOLUTION = "ModuleResolution";
111
112 /** ModuleTarget */
113 public static final String NAME_MODULE_TARGET = "ModuleTarget";
114
115 /** NestHost */
116 public static final String NAME_NEST_HOST = "NestHost";
117
118 /** NestMembers */
119 public static final String NAME_NEST_MEMBERS = "NestMembers";
120
121 /** PermittedSubclasses */
122 public static final String NAME_PERMITTED_SUBCLASSES = "PermittedSubclasses";
123
124 /** Record */
125 public static final String NAME_RECORD = "Record";
126
127 /** RuntimeInvisibleAnnotations */
128 public static final String NAME_RUNTIME_INVISIBLE_ANNOTATIONS = "RuntimeInvisibleAnnotations";
129
130 /** RuntimeInvisibleParameterAnnotations */
131 public static final String NAME_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = "RuntimeInvisibleParameterAnnotations";
132
133 /** RuntimeInvisibleTypeAnnotations */
134 public static final String NAME_RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations";
135
136 /** RuntimeVisibleAnnotations */
137 public static final String NAME_RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations";
138
139 /** RuntimeVisibleParameterAnnotations */
140 public static final String NAME_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = "RuntimeVisibleParameterAnnotations";
141
142 /** RuntimeVisibleTypeAnnotations */
143 public static final String NAME_RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations";
144
145 /** Signature */
146 public static final String NAME_SIGNATURE = "Signature";
147
148 /** SourceDebugExtension */
149 public static final String NAME_SOURCE_DEBUG_EXTENSION = "SourceDebugExtension";
150
151 /** SourceFile */
152 public static final String NAME_SOURCE_FILE = "SourceFile";
153
154 /** SourceID */
155 public static final String NAME_SOURCE_ID = "SourceID";
156
157 /** StackMapTable */
158 public static final String NAME_STACK_MAP_TABLE = "StackMapTable";
159
160 /** Synthetic */
161 public static final String NAME_SYNTHETIC = "Synthetic";
162
163 private Attributes() {
164 }
165
166 /**
167 * {@return the mapper for the {@code AnnotationDefault} attribute}
168 */
169 public static AttributeMapper<AnnotationDefaultAttribute> annotationDefault() {
170 return AnnotationDefaultMapper.INSTANCE;
171 }
172
173 /**
174 * {@return the mapper for the {@code BootstrapMethods} attribute}
175 */
176 public static AttributeMapper<BootstrapMethodsAttribute> bootstrapMethods() {
177 return BootstrapMethodsMapper.INSTANCE;
178 }
179
180 /**
181 * {@return the mapper for the {@code CharacterRangeTable} attribute}
182 * This is a JDK-specific attribute.
183 * The mapper permits multiple instances in a {@code Code} attribute, but this
184 * attribute should be only emitted once.
185 * This has a data dependency on {@linkplain AttributeStability#LABELS labels}.
186 */
187 public static AttributeMapper<CharacterRangeTableAttribute> characterRangeTable() {
188 return CharacterRangeTableMapper.INSTANCE;
189 }
190
191 /**
192 * {@return the mapper for the {@code Code} attribute}
193 */
194 public static AttributeMapper<CodeAttribute> code() {
195 return CodeMapper.INSTANCE;
196 }
197
198 /**
199 * {@return the mapper for the {@code CompilationID} attribute}
200 * This is a JDK-specific attribute.
201 */
202 public static AttributeMapper<CompilationIDAttribute> compilationId() {
203 return CompilationIDMapper.INSTANCE;
204 }
205
206 /**
207 * {@return the mapper for the {@code ConstantValue} attribute}
208 */
209 public static AttributeMapper<ConstantValueAttribute> constantValue() {
210 return ConstantValueMapper.INSTANCE;
211 }
212
213 /**
214 * {@return the mapper for the {@code Deprecated} attribute}
215 * The mapper permits multiple instances in a given location.
216 * This has {@linkplain AttributeStability#STATELESS no data dependency}.
217 */
218 public static AttributeMapper<DeprecatedAttribute> deprecated() {
219 return DeprecatedMapper.INSTANCE;
220 }
221
222 /**
223 * {@return the mapper for the {@code EnclosingMethod} attribute}
224 */
225 public static AttributeMapper<EnclosingMethodAttribute> enclosingMethod() {
226 return EnclosingMethodMapper.INSTANCE;
227 }
228
229 /**
230 * {@return the mapper for the {@code Exceptions} attribute}
231 */
232 public static AttributeMapper<ExceptionsAttribute> exceptions() {
233 return ExceptionsMapper.INSTANCE;
234 }
235
236 /**
237 * {@return the mapper for the {@code InnerClasses} attribute}
238 */
239 public static AttributeMapper<InnerClassesAttribute> innerClasses() {
240 return InnerClassesMapper.INSTANCE;
241 }
242
243 /**
244 * {@return the mapper for the {@code LineNumberTable} attribute}
245 * The mapper permits multiple instances in a {@code Code} attribute.
246 * This has a data dependency on {@linkplain AttributeStability#LABELS labels}.
247 */
248 public static AttributeMapper<LineNumberTableAttribute> lineNumberTable() {
249 return LineNumberTableMapper.INSTANCE;
250 }
251
252 /**
253 * {@return Attribute mapper for the {@code LoadableDescriptors} attribute}
254 * @since Valhalla
255 */
256 @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS)
257 public static AttributeMapper<LoadableDescriptorsAttribute> loadableDescriptors() {
258 return LoadableDescriptorsMapper.INSTANCE;
259 }
260
261 /**
262 * {@return the mapper for the {@code LocalVariableTable} attribute}
263 * The mapper permits multiple instances in a {@code Code} attribute.
264 * This has a data dependency on {@linkplain AttributeStability#LABELS labels}.
265 */
266 public static AttributeMapper<LocalVariableTableAttribute> localVariableTable() {
267 return LocalVariableTableMapper.INSTANCE;
268 }
269
270 /**
271 * {@return the mapper for the {@code LocalVariableTypeTable} attribute}
272 * The mapper permits multiple instances in a given location.
273 * This has a data dependency on {@linkplain AttributeStability#LABELS labels}.
274 */
275 public static AttributeMapper<LocalVariableTypeTableAttribute> localVariableTypeTable() {
276 return LocalVariableTypeTableMapper.INSTANCE;
277 }
278
279 /**
280 * {@return the mapper for the {@code MethodParameters} attribute}
281 */
282 public static AttributeMapper<MethodParametersAttribute> methodParameters() {
283 return MethodParametersMapper.INSTANCE;
284 }
285
286 /**
287 * {@return the mapper for the {@code Module} attribute}
288 */
289 public static AttributeMapper<ModuleAttribute> module() {
290 return ModuleMapper.INSTANCE;
291 }
292
293 /**
294 * {@return the mapper for the {@code ModuleHashes} attribute}
295 * This is a JDK-specific attribute.
296 */
297 public static AttributeMapper<ModuleHashesAttribute> moduleHashes() {
298 return ModuleHashesMapper.INSTANCE;
299 }
300
301 /**
302 * {@return the mapper for the {@code ModuleMainClass} attribute}
303 */
304 public static AttributeMapper<ModuleMainClassAttribute> moduleMainClass() {
305 return ModuleMainClassMapper.INSTANCE;
306 }
307
308 /**
309 * {@return the mapper for the {@code ModulePackages} attribute}
310 */
311 public static AttributeMapper<ModulePackagesAttribute> modulePackages() {
312 return ModulePackagesMapper.INSTANCE;
313 }
314
315 /**
316 * {@return the mapper for the {@code ModuleResolution} attribute}
317 * This is a JDK-specific attribute.
318 * This has {@linkplain AttributeStability#STATELESS no data dependency}.
319 */
320 public static AttributeMapper<ModuleResolutionAttribute> moduleResolution() {
321 return ModuleResolutionMapper.INSTANCE;
322 }
323
324 /**
325 * {@return the mapper for the {@code ModuleTarget} attribute}
326 * This is a JDK-specific attribute.
327 */
328 public static AttributeMapper<ModuleTargetAttribute> moduleTarget() {
329 return ModuleTargetMapper.INSTANCE;
330 }
331
332 /**
333 * {@return the mapper for the {@code NestHost} attribute}
334 */
335 public static AttributeMapper<NestHostAttribute> nestHost() {
336 return NestHostMapper.INSTANCE;
337 }
338
339 /**
340 * {@return the mapper for the {@code NestMembers} attribute}
341 */
342 public static AttributeMapper<NestMembersAttribute> nestMembers() {
343 return NestMembersMapper.INSTANCE;
344 }
345
346 /**
347 * {@return the mapper for the {@code PermittedSubclasses} attribute}
348 */
349 public static AttributeMapper<PermittedSubclassesAttribute> permittedSubclasses() {
350 return PermittedSubclassesMapper.INSTANCE;
351 }
352
353 /**
354 * {@return the mapper for the {@code Record} attribute}
355 */
356 public static AttributeMapper<RecordAttribute> record() {
357 return RecordMapper.INSTANCE;
358 }
359
360 /**
361 * {@return the mapper for the {@code RuntimeInvisibleAnnotations} attribute}
362 */
363 public static AttributeMapper<RuntimeInvisibleAnnotationsAttribute> runtimeInvisibleAnnotations() {
364 return RuntimeInvisibleAnnotationsMapper.INSTANCE;
365 }
366
367 /**
368 * {@return the mapper for the {@code RuntimeInvisibleParameterAnnotations} attribute}
369 */
370 public static AttributeMapper<RuntimeInvisibleParameterAnnotationsAttribute> runtimeInvisibleParameterAnnotations() {
371 return RuntimeInvisibleParameterAnnotationsMapper.INSTANCE;
372 }
373
374 /**
375 * {@return the mapper for the {@code RuntimeInvisibleTypeAnnotations} attribute}
376 * This has a data dependency on {@linkplain AttributeStability#UNSTABLE
377 * arbitrary indices} in the {@code class} file format.
378 */
379 public static AttributeMapper<RuntimeInvisibleTypeAnnotationsAttribute> runtimeInvisibleTypeAnnotations() {
380 return RuntimeInvisibleTypeAnnotationsMapper.INSTANCE;
381 }
382
383 /**
384 * {@return the mapper for the {@code RuntimeVisibleAnnotations} attribute}
385 */
386 public static AttributeMapper<RuntimeVisibleAnnotationsAttribute> runtimeVisibleAnnotations() {
387 return RuntimeVisibleAnnotationsMapper.INSTANCE;
388 }
389
390 /**
391 * {@return the mapper for the {@code RuntimeVisibleParameterAnnotations} attribute}
392 */
393 public static AttributeMapper<RuntimeVisibleParameterAnnotationsAttribute> runtimeVisibleParameterAnnotations() {
394 return RuntimeVisibleParameterAnnotationsMapper.INSTANCE;
395 }
396
397 /**
398 * {@return the mapper for the {@code RuntimeVisibleTypeAnnotations} attribute}
399 * This has a data dependency on {@linkplain AttributeStability#UNSTABLE
400 * arbitrary indices} in the {@code class} file format.
401 */
402 public static AttributeMapper<RuntimeVisibleTypeAnnotationsAttribute> runtimeVisibleTypeAnnotations() {
403 return RuntimeVisibleTypeAnnotationsMapper.INSTANCE;
404 }
405
406 /**
407 * {@return the mapper for the {@code Signature} attribute}
408 */
409 public static AttributeMapper<SignatureAttribute> signature() {
410 return SignatureMapper.INSTANCE;
411 }
412
413 /**
414 * {@return the mapper for the {@code SourceDebugExtension} attribute}
415 * This has {@linkplain AttributeStability#STATELESS no data dependency}.
416 */
417 public static AttributeMapper<SourceDebugExtensionAttribute> sourceDebugExtension() {
418 return SourceDebugExtensionMapper.INSTANCE;
419 }
420
421 /**
422 * {@return the mapper for the {@code SourceFile} attribute}
423 */
424 public static AttributeMapper<SourceFileAttribute> sourceFile() {
425 return SourceFileMapper.INSTANCE;
426 }
427
428 /**
429 * {@return the mapper for the {@code SourceID} attribute}
430 * This is a JDK-specific attribute.
431 */
432 public static AttributeMapper<SourceIDAttribute> sourceId() {
433 return SourceIDMapper.INSTANCE;
434 }
435
436 /**
437 * {@return the mapper for the {@code StackMapTable} attribute}
438 * This has a data dependency on {@linkplain AttributeStability#LABELS labels}.
439 */
440 public static AttributeMapper<StackMapTableAttribute> stackMapTable() {
441 return StackMapTableMapper.INSTANCE;
442 }
443
444 /**
445 * {@return the mapper for the {@code Synthetic} attribute}
446 * The mapper permits multiple instances in a given location.
447 * This has {@linkplain AttributeStability#STATELESS no data dependency}.
448 */
449 public static AttributeMapper<SyntheticAttribute> synthetic() {
450 return SyntheticMapper.INSTANCE;
451 }
452 }