< prev index next >
src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Attribute.java
Print this page
@@ -1,8 +1,7 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
@@ -16,27 +15,30 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.sun.org.apache.bcel.internal.classfile;
-
-import com.sun.org.apache.bcel.internal.Constants;
-import java.io.*;
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
import java.util.HashMap;
+import java.util.Map;
+
+import com.sun.org.apache.bcel.internal.Const;
/**
* Abstract super class for <em>Attribute</em> objects. Currently the
* <em>ConstantValue</em>, <em>SourceFile</em>, <em>Code</em>,
* <em>Exceptiontable</em>, <em>LineNumberTable</em>,
* <em>LocalVariableTable</em>, <em>InnerClasses</em> and
- * <em>Synthetic</em> attributes are supported. The
- * <em>Unknown</em> attribute stands for non-standard-attributes.
+ * <em>Synthetic</em> attributes are supported. The <em>Unknown</em>
+ * attribute stands for non-standard-attributes.
*
- * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
+ * @version $Id: Attribute.java 1750029 2016-06-23 22:14:38Z sebb $
* @see ConstantValue
* @see SourceFile
* @see Code
* @see Unknown
* @see ExceptionTable
@@ -44,19 +46,19 @@
* @see LocalVariableTable
* @see InnerClasses
* @see Synthetic
* @see Deprecated
* @see Signature
-*/
-public abstract class Attribute implements Cloneable, Node, Serializable {
- protected int name_index; // Points to attribute name in constant pool
- protected int length; // Content length of attribute field
- protected byte tag; // Tag to distiguish subclasses
- protected ConstantPool constant_pool;
+ */
+public abstract class Attribute implements Cloneable, Node {
- protected Attribute(byte tag, int name_index, int length,
- ConstantPool constant_pool) {
+ private int name_index; // Points to attribute name in constant pool
+ private int length; // Content length of attribute field
+ private final byte tag; // Tag to distinguish subclasses
+ private ConstantPool constant_pool;
+
+ protected Attribute(final byte tag, final int name_index, final int length, final ConstantPool constant_pool) {
this.tag = tag;
this.name_index = name_index;
this.length = length;
this.constant_pool = constant_pool;
}
@@ -66,207 +68,244 @@
* defined by the contents of a Java class. I.e., the hierarchy of methods,
* fields, attributes, etc. spawns a tree of objects.
*
* @param v Visitor object
*/
+ @Override
public abstract void accept(Visitor v);
/**
* Dump attribute to file stream in binary format.
*
* @param file Output file stream
* @throws IOException
*/
- public void dump(DataOutputStream file) throws IOException
- {
+ public void dump(final DataOutputStream file) throws IOException {
file.writeShort(name_index);
file.writeInt(length);
}
- private static HashMap readers = new HashMap();
+ private static final Map<String, Object> readers = new HashMap<>();
- /** Add an Attribute reader capable of parsing (user-defined) attributes
- * named "name". You should not add readers for the standard attributes
- * such as "LineNumberTable", because those are handled internally.
+ /**
+ * Add an Attribute reader capable of parsing (user-defined) attributes
+ * named "name". You should not add readers for the standard attributes such
+ * as "LineNumberTable", because those are handled internally.
*
* @param name the name of the attribute as stored in the class file
* @param r the reader object
*/
- public static void addAttributeReader(String name, AttributeReader r) {
+ public static void addAttributeReader(final String name, final UnknownAttributeReader r) {
readers.put(name, r);
}
- /** Remove attribute reader
+ /**
+ * Remove attribute reader
*
* @param name the name of the attribute as stored in the class file
*/
- public static void removeAttributeReader(String name) {
+ public static void removeAttributeReader(final String name) {
readers.remove(name);
}
- /* Class method reads one attribute from the input data stream.
- * This method must not be accessible from the outside. It is
- * called by the Field and Method constructor methods.
+ /**
+ * Class method reads one attribute from the input data stream. This method
+ * must not be accessible from the outside. It is called by the Field and
+ * Method constructor methods.
*
* @see Field
* @see Method
+ *
* @param file Input stream
* @param constant_pool Array of constants
* @return Attribute
* @throws IOException
* @throws ClassFormatException
*/
- public static final Attribute readAttribute(DataInputStream file,
- ConstantPool constant_pool)
- throws IOException, ClassFormatException
- {
- ConstantUtf8 c;
- String name;
- int name_index;
- int length;
- byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute
+ public static Attribute readAttribute(final DataInputStream file, final ConstantPool constant_pool)
+ throws IOException, ClassFormatException {
+ return readAttribute((DataInput) file, constant_pool);
+ }
+ /**
+ * Class method reads one attribute from the input data stream. This method
+ * must not be accessible from the outside. It is called by the Field and
+ * Method constructor methods.
+ *
+ * @see Field
+ * @see Method
+ *
+ * @param file Input stream
+ * @param constant_pool Array of constants
+ * @return Attribute
+ * @throws IOException
+ * @throws ClassFormatException
+ * @since 6.0
+ */
+ public static Attribute readAttribute(final DataInput file, final ConstantPool constant_pool)
+ throws IOException, ClassFormatException {
+ byte tag = Const.ATTR_UNKNOWN; // Unknown attribute
// Get class name from constant pool via `name_index' indirection
- name_index = (int)file.readUnsignedShort();
- c = (ConstantUtf8)constant_pool.getConstant(name_index,
- Constants.CONSTANT_Utf8);
- name = c.getBytes();
+ final int name_index = file.readUnsignedShort();
+ final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8);
+ final String name = c.getBytes();
// Length of data in bytes
- length = file.readInt();
+ final int length = file.readInt();
// Compare strings to find known attribute
- for(byte i=0; i < Constants.KNOWN_ATTRIBUTES; i++) {
- if(name.equals(Constants.ATTRIBUTE_NAMES[i])) {
+ for (byte i = 0; i < Const.KNOWN_ATTRIBUTES; i++) {
+ if (name.equals(Const.getAttributeName(i))) {
tag = i; // found!
break;
}
}
// Call proper constructor, depending on `tag'
- switch(tag) {
- case Constants.ATTR_UNKNOWN:
- AttributeReader r = (AttributeReader)readers.get(name);
-
- if(r != null)
- return r.createAttribute(name_index, length, file, constant_pool);
- else
+ switch (tag) {
+ case Const.ATTR_UNKNOWN:
+ final Object r = readers.get(name);
+ if (r instanceof UnknownAttributeReader) {
+ return ((UnknownAttributeReader) r).createAttribute(name_index, length, file, constant_pool);
+ }
return new Unknown(name_index, length, file, constant_pool);
-
- case Constants.ATTR_CONSTANT_VALUE:
+ case Const.ATTR_CONSTANT_VALUE:
return new ConstantValue(name_index, length, file, constant_pool);
-
- case Constants.ATTR_SOURCE_FILE:
+ case Const.ATTR_SOURCE_FILE:
return new SourceFile(name_index, length, file, constant_pool);
-
- case Constants.ATTR_CODE:
+ case Const.ATTR_CODE:
return new Code(name_index, length, file, constant_pool);
-
- case Constants.ATTR_EXCEPTIONS:
+ case Const.ATTR_EXCEPTIONS:
return new ExceptionTable(name_index, length, file, constant_pool);
-
- case Constants.ATTR_LINE_NUMBER_TABLE:
+ case Const.ATTR_LINE_NUMBER_TABLE:
return new LineNumberTable(name_index, length, file, constant_pool);
-
- case Constants.ATTR_LOCAL_VARIABLE_TABLE:
+ case Const.ATTR_LOCAL_VARIABLE_TABLE:
return new LocalVariableTable(name_index, length, file, constant_pool);
-
- case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE:
- return new LocalVariableTypeTable(name_index, length, file, constant_pool);
-
- case Constants.ATTR_INNER_CLASSES:
+ case Const.ATTR_INNER_CLASSES:
return new InnerClasses(name_index, length, file, constant_pool);
-
- case Constants.ATTR_SYNTHETIC:
+ case Const.ATTR_SYNTHETIC:
return new Synthetic(name_index, length, file, constant_pool);
-
- case Constants.ATTR_DEPRECATED:
+ case Const.ATTR_DEPRECATED:
return new Deprecated(name_index, length, file, constant_pool);
-
- case Constants.ATTR_PMG:
+ case Const.ATTR_PMG:
return new PMGClass(name_index, length, file, constant_pool);
-
- case Constants.ATTR_SIGNATURE:
+ case Const.ATTR_SIGNATURE:
return new Signature(name_index, length, file, constant_pool);
-
- case Constants.ATTR_STACK_MAP:
+ case Const.ATTR_STACK_MAP:
return new StackMap(name_index, length, file, constant_pool);
-
- default: // Never reached
- throw new IllegalStateException("Ooops! default case reached.");
+ case Const.ATTR_RUNTIME_VISIBLE_ANNOTATIONS:
+ return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool);
+ case Const.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS:
+ return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool);
+ case Const.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS:
+ return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool);
+ case Const.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS:
+ return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool);
+ case Const.ATTR_ANNOTATION_DEFAULT:
+ return new AnnotationDefault(name_index, length, file, constant_pool);
+ case Const.ATTR_LOCAL_VARIABLE_TYPE_TABLE:
+ return new LocalVariableTypeTable(name_index, length, file, constant_pool);
+ case Const.ATTR_ENCLOSING_METHOD:
+ return new EnclosingMethod(name_index, length, file, constant_pool);
+ case Const.ATTR_STACK_MAP_TABLE:
+ return new StackMap(name_index, length, file, constant_pool);
+ case Const.ATTR_BOOTSTRAP_METHODS:
+ return new BootstrapMethods(name_index, length, file, constant_pool);
+ case Const.ATTR_METHOD_PARAMETERS:
+ return new MethodParameters(name_index, length, file, constant_pool);
+ default:
+ // Never reached
+ throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag);
+ }
}
+
+ /**
+ * @return Name of attribute
+ * @since 6.0
+ */
+ public String getName() {
+ final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8);
+ return c.getBytes();
}
/**
* @return Length of attribute field in bytes.
*/
- public final int getLength() { return length; }
+ public final int getLength() {
+ return length;
+ }
/**
- * @param Attribute length in bytes.
+ * @param length length in bytes.
*/
- public final void setLength(int length) {
+ public final void setLength(final int length) {
this.length = length;
}
/**
* @param name_index of attribute.
*/
- public final void setNameIndex(int name_index) {
+ public final void setNameIndex(final int name_index) {
this.name_index = name_index;
}
/**
* @return Name index in constant pool of attribute name.
*/
- public final int getNameIndex() { return name_index; }
+ public final int getNameIndex() {
+ return name_index;
+ }
/**
* @return Tag of attribute, i.e., its type. Value may not be altered, thus
* there is no setTag() method.
*/
- public final byte getTag() { return tag; }
+ public final byte getTag() {
+ return tag;
+ }
/**
* @return Constant pool used by this object.
* @see ConstantPool
*/
- public final ConstantPool getConstantPool() { return constant_pool; }
+ public final ConstantPool getConstantPool() {
+ return constant_pool;
+ }
/**
* @param constant_pool Constant pool to be used for this object.
* @see ConstantPool
*/
- public final void setConstantPool(ConstantPool constant_pool) {
+ public final void setConstantPool(final ConstantPool constant_pool) {
this.constant_pool = constant_pool;
}
/**
* Use copy() if you want to have a deep copy(), i.e., with all references
* copied correctly.
*
* @return shallow copy of this attribute
*/
+ @Override
public Object clone() {
- Object o = null;
-
+ Attribute attr = null;
try {
- o = super.clone();
- } catch(CloneNotSupportedException e) {
- e.printStackTrace(); // Never occurs
+ attr = (Attribute) super.clone();
+ } catch (final CloneNotSupportedException e) {
+ throw new Error("Clone Not Supported"); // never happens
}
-
- return o;
+ return attr;
}
/**
* @return deep copy of this attribute
*/
- public abstract Attribute copy(ConstantPool constant_pool);
+ public abstract Attribute copy(ConstantPool _constant_pool);
/**
* @return attribute name.
*/
+ @Override
public String toString() {
- return Constants.ATTRIBUTE_NAMES[tag];
+ return Const.getAttributeName(tag);
}
}
< prev index next >