Attribute.java revision 3792:d516975e8110
152419Sjulian/* 252419Sjulian * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. 3139823Simp * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4139823Simp * 5139823Simp * This code is free software; you can redistribute it and/or modify it 652419Sjulian * under the terms of the GNU General Public License version 2 only, as 752419Sjulian * published by the Free Software Foundation. Oracle designates this 852419Sjulian * particular file as subject to the "Classpath" exception as provided 952419Sjulian * by Oracle in the LICENSE file that accompanied this code. 1052419Sjulian * 1152419Sjulian * This code is distributed in the hope that it will be useful, but WITHOUT 1252419Sjulian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1352419Sjulian * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1452419Sjulian * version 2 for more details (a copy is included in the LICENSE file that 1552419Sjulian * accompanied this code). 1652419Sjulian * 1752419Sjulian * You should have received a copy of the GNU General Public License version 1852419Sjulian * 2 along with this work; if not, write to the Free Software Foundation, 1952419Sjulian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2052419Sjulian * 2152419Sjulian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2252419Sjulian * or visit www.oracle.com if you need additional information or have any 2352419Sjulian * questions. 2452419Sjulian */ 2552419Sjulian 2652419Sjulianpackage com.sun.tools.classfile; 2752419Sjulian 2852419Sjulianimport java.io.IOException; 2952419Sjulianimport java.lang.reflect.Constructor; 3052419Sjulianimport java.util.HashMap; 3152419Sjulianimport java.util.Map; 3252419Sjulian 3352419Sjulian/** 3452419Sjulian * <p><b>This is NOT part of any supported API. 3552419Sjulian * If you write code that depends on this, you do so at your own risk. 3652419Sjulian * This code and its internal interfaces are subject to change or 3752419Sjulian * deletion without notice.</b> 3870700Sjulian */ 3952419Sjulian 4052419Sjulianpublic abstract class Attribute { 4152752Sjulian public static final String AnnotationDefault = "AnnotationDefault"; 4252419Sjulian public static final String BootstrapMethods = "BootstrapMethods"; 4352419Sjulian public static final String CharacterRangeTable = "CharacterRangeTable"; 4452419Sjulian public static final String Code = "Code"; 4552419Sjulian public static final String ConstantValue = "ConstantValue"; 4652419Sjulian public static final String CompilationID = "CompilationID"; 4752419Sjulian public static final String Deprecated = "Deprecated"; 4852419Sjulian public static final String EnclosingMethod = "EnclosingMethod"; 4952419Sjulian public static final String Exceptions = "Exceptions"; 5052419Sjulian public static final String InnerClasses = "InnerClasses"; 5152419Sjulian public static final String LineNumberTable = "LineNumberTable"; 5252419Sjulian public static final String LocalVariableTable = "LocalVariableTable"; 5352419Sjulian public static final String LocalVariableTypeTable = "LocalVariableTypeTable"; 5452419Sjulian public static final String MethodParameters = "MethodParameters"; 5552419Sjulian public static final String Module = "Module"; 5652419Sjulian public static final String ModuleHashes = "ModuleHashes"; 5752419Sjulian public static final String ModuleMainClass = "ModuleMainClass"; 5852419Sjulian public static final String ModulePackages = "ModulePackages"; 5952419Sjulian public static final String ModuleTarget = "ModuleTarget"; 6052843Sphk public static final String ModuleVersion = "ModuleVersion"; 6152419Sjulian public static final String RuntimeVisibleAnnotations = "RuntimeVisibleAnnotations"; 6252419Sjulian public static final String RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations"; 6352419Sjulian public static final String RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations"; 6452419Sjulian public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations"; 6552419Sjulian public static final String RuntimeVisibleTypeAnnotations = "RuntimeVisibleTypeAnnotations"; 6652419Sjulian public static final String RuntimeInvisibleTypeAnnotations = "RuntimeInvisibleTypeAnnotations"; 6752419Sjulian public static final String Signature = "Signature"; 6852419Sjulian public static final String SourceDebugExtension = "SourceDebugExtension"; 6952419Sjulian public static final String SourceFile = "SourceFile"; 7052419Sjulian public static final String SourceID = "SourceID"; 7152419Sjulian public static final String StackMap = "StackMap"; 7252419Sjulian public static final String StackMapTable = "StackMapTable"; 7352419Sjulian public static final String Synthetic = "Synthetic"; 7452419Sjulian 7552419Sjulian public static class Factory { 7652419Sjulian public Factory() { 7752419Sjulian // defer init of standardAttributeClasses until after options set up 7852419Sjulian } 7952419Sjulian 8052419Sjulian public Attribute createAttribute(ClassReader cr, int name_index, byte[] data) 8152419Sjulian throws IOException { 8252419Sjulian if (standardAttributes == null) { 8352419Sjulian init(); 8452419Sjulian } 8552419Sjulian 8652419Sjulian ConstantPool cp = cr.getConstantPool(); 8752419Sjulian String reasonForDefaultAttr; 8852419Sjulian try { 8952419Sjulian String name = cp.getUTF8Value(name_index); 9052419Sjulian Class<? extends Attribute> attrClass = standardAttributes.get(name); 9152419Sjulian if (attrClass != null) { 9252419Sjulian try { 9352419Sjulian Class<?>[] constrArgTypes = {ClassReader.class, int.class, int.class}; 9452419Sjulian Constructor<? extends Attribute> constr = attrClass.getDeclaredConstructor(constrArgTypes); 9552419Sjulian return constr.newInstance(cr, name_index, data.length); 9652419Sjulian } catch (Throwable t) { 9752419Sjulian reasonForDefaultAttr = t.toString(); 9852419Sjulian // fall through and use DefaultAttribute 9952419Sjulian // t.printStackTrace(); 10052419Sjulian } 10152419Sjulian } else { 10252419Sjulian reasonForDefaultAttr = "unknown attribute"; 103132010Srwatson } 10452419Sjulian } catch (ConstantPoolException e) { 10552419Sjulian reasonForDefaultAttr = e.toString(); 10652419Sjulian // fall through and use DefaultAttribute 10752419Sjulian } 10852419Sjulian return new DefaultAttribute(cr, name_index, data, reasonForDefaultAttr); 10952419Sjulian } 11052419Sjulian 11152419Sjulian protected void init() { 11252419Sjulian standardAttributes = new HashMap<>(); 11352419Sjulian standardAttributes.put(AnnotationDefault, AnnotationDefault_attribute.class); 11452419Sjulian standardAttributes.put(BootstrapMethods, BootstrapMethods_attribute.class); 11552419Sjulian standardAttributes.put(CharacterRangeTable, CharacterRangeTable_attribute.class); 11652419Sjulian standardAttributes.put(Code, Code_attribute.class); 11752419Sjulian standardAttributes.put(CompilationID, CompilationID_attribute.class); 11852419Sjulian standardAttributes.put(ConstantValue, ConstantValue_attribute.class); 11952419Sjulian standardAttributes.put(Deprecated, Deprecated_attribute.class); 12052419Sjulian standardAttributes.put(EnclosingMethod, EnclosingMethod_attribute.class); 12152419Sjulian standardAttributes.put(Exceptions, Exceptions_attribute.class); 12252419Sjulian standardAttributes.put(InnerClasses, InnerClasses_attribute.class); 12352419Sjulian standardAttributes.put(LineNumberTable, LineNumberTable_attribute.class); 12452419Sjulian standardAttributes.put(LocalVariableTable, LocalVariableTable_attribute.class); 12552419Sjulian standardAttributes.put(LocalVariableTypeTable, LocalVariableTypeTable_attribute.class); 12652419Sjulian standardAttributes.put(MethodParameters, MethodParameters_attribute.class); 12752419Sjulian standardAttributes.put(Module, Module_attribute.class); 12852752Sjulian standardAttributes.put(ModuleHashes, ModuleHashes_attribute.class); 12970700Sjulian standardAttributes.put(ModuleMainClass, ModuleMainClass_attribute.class); 13052752Sjulian standardAttributes.put(ModulePackages, ModulePackages_attribute.class); 13152752Sjulian standardAttributes.put(ModuleTarget, ModuleTarget_attribute.class); 13252752Sjulian standardAttributes.put(ModuleVersion, ModuleVersion_attribute.class); 13352419Sjulian standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class); 13452419Sjulian standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class); 13570700Sjulian standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class); 13652419Sjulian standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class); 13752419Sjulian standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class); 13852419Sjulian standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class); 13952419Sjulian standardAttributes.put(Signature, Signature_attribute.class); 14052419Sjulian standardAttributes.put(SourceDebugExtension, SourceDebugExtension_attribute.class); 141129823Sjulian standardAttributes.put(SourceFile, SourceFile_attribute.class); 142129823Sjulian standardAttributes.put(SourceID, SourceID_attribute.class); 143129823Sjulian standardAttributes.put(StackMap, StackMap_attribute.class); 144129823Sjulian standardAttributes.put(StackMapTable, StackMapTable_attribute.class); 145129823Sjulian standardAttributes.put(Synthetic, Synthetic_attribute.class); 146129823Sjulian } 147129823Sjulian 14852419Sjulian private Map<String,Class<? extends Attribute>> standardAttributes; 14952419Sjulian } 15052419Sjulian 15152419Sjulian public static Attribute read(ClassReader cr) throws IOException { 15252419Sjulian return cr.readAttribute(); 15352419Sjulian } 15452419Sjulian 15552419Sjulian protected Attribute(int name_index, int length) { 15652419Sjulian attribute_name_index = name_index; 15752419Sjulian attribute_length = length; 15852419Sjulian } 15952419Sjulian 16052419Sjulian public String getName(ConstantPool constant_pool) throws ConstantPoolException { 16152419Sjulian return constant_pool.getUTF8Value(attribute_name_index); 16252419Sjulian } 16352419Sjulian 16452419Sjulian public abstract <R,D> R accept(Attribute.Visitor<R,D> visitor, D data); 16552419Sjulian 16652419Sjulian public int byteLength() { 16752419Sjulian return 6 + attribute_length; 16852419Sjulian } 16952419Sjulian 17052419Sjulian public final int attribute_name_index; 17152419Sjulian public final int attribute_length; 17252419Sjulian 17352419Sjulian 17452419Sjulian public interface Visitor<R,P> { 17552419Sjulian R visitBootstrapMethods(BootstrapMethods_attribute attr, P p); 17652419Sjulian R visitDefault(DefaultAttribute attr, P p); 17752419Sjulian R visitAnnotationDefault(AnnotationDefault_attribute attr, P p); 17852419Sjulian R visitCharacterRangeTable(CharacterRangeTable_attribute attr, P p); 17952419Sjulian R visitCode(Code_attribute attr, P p); 18052419Sjulian R visitCompilationID(CompilationID_attribute attr, P p); 18152419Sjulian R visitConstantValue(ConstantValue_attribute attr, P p); 18252419Sjulian R visitDeprecated(Deprecated_attribute attr, P p); 18352419Sjulian R visitEnclosingMethod(EnclosingMethod_attribute attr, P p); 18452419Sjulian R visitExceptions(Exceptions_attribute attr, P p); 18552419Sjulian R visitInnerClasses(InnerClasses_attribute attr, P p); 18652419Sjulian R visitLineNumberTable(LineNumberTable_attribute attr, P p); 18752419Sjulian R visitLocalVariableTable(LocalVariableTable_attribute attr, P p); 18852419Sjulian R visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, P p); 18952419Sjulian R visitMethodParameters(MethodParameters_attribute attr, P p); 19052419Sjulian R visitModule(Module_attribute attr, P p); 19152419Sjulian R visitModuleHashes(ModuleHashes_attribute attr, P p); 19252419Sjulian R visitModuleMainClass(ModuleMainClass_attribute attr, P p); 19352419Sjulian R visitModulePackages(ModulePackages_attribute attr, P p); 19452419Sjulian R visitModuleTarget(ModuleTarget_attribute attr, P p); 19552419Sjulian R visitModuleVersion(ModuleVersion_attribute attr, P p); 19652419Sjulian R visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, P p); 19752419Sjulian R visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, P p); 19852419Sjulian R visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, P p); 19952419Sjulian R visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, P p); 20052419Sjulian R visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, P p); 20152419Sjulian R visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, P p); 20252419Sjulian R visitSignature(Signature_attribute attr, P p); 20352419Sjulian R visitSourceDebugExtension(SourceDebugExtension_attribute attr, P p); 20452419Sjulian R visitSourceFile(SourceFile_attribute attr, P p); 20552419Sjulian R visitSourceID(SourceID_attribute attr, P p); 20652419Sjulian R visitStackMap(StackMap_attribute attr, P p); 20752419Sjulian R visitStackMapTable(StackMapTable_attribute attr, P p); 20852419Sjulian R visitSynthetic(Synthetic_attribute attr, P p); 20952419Sjulian } 21052419Sjulian} 21170700Sjulian