jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java
changeset 46174 5611d2529b49
parent 44797 8b3b3b911b8a
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java	Tue Aug 08 22:52:41 2017 +0000
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java	Sun Aug 13 21:10:40 2017 -0700
@@ -21,112 +21,183 @@
 
 package com.sun.org.apache.bcel.internal.classfile;
 
-import  com.sun.org.apache.bcel.internal.Constants;
+import java.io.DataInput;
+import java.io.IOException;
+
+import com.sun.org.apache.bcel.internal.Const;
 import com.sun.org.apache.bcel.internal.generic.Type;
-import java.io.*;
+import com.sun.org.apache.bcel.internal.util.BCELComparator;
 
 /**
  * This class represents the field info structure, i.e., the representation
  * for a variable in the class. See JVM specification for details.
  *
- * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
+ * @version $Id: Field.java 1749603 2016-06-21 20:50:19Z ggregory $
  */
 public final class Field extends FieldOrMethod {
-  /**
-   * Initialize from another object. Note that both objects use the same
-   * references (shallow copy). Use clone() for a physical copy.
-   */
-  public Field(Field c) {
-    super(c);
-  }
+
+    private static BCELComparator bcelComparator = new BCELComparator() {
+
+        @Override
+        public boolean equals( final Object o1, final Object o2 ) {
+            final Field THIS = (Field) o1;
+            final Field THAT = (Field) o2;
+            return THIS.getName().equals(THAT.getName())
+                    && THIS.getSignature().equals(THAT.getSignature());
+        }
+
+
+        @Override
+        public int hashCode( final Object o ) {
+            final Field THIS = (Field) o;
+            return THIS.getSignature().hashCode() ^ THIS.getName().hashCode();
+        }
+    };
 
-  /**
-   * Construct object from file stream.
-   * @param file Input stream
-   */
-  Field(DataInputStream file, ConstantPool constant_pool)
-       throws IOException, ClassFormatException
-  {
-    super(file, constant_pool);
-  }
+
+    /**
+     * Initialize from another object. Note that both objects use the same
+     * references (shallow copy). Use clone() for a physical copy.
+     */
+    public Field(final Field c) {
+        super(c);
+    }
 
-  /**
-   * @param access_flags Access rights of field
-   * @param name_index Points to field name in constant pool
-   * @param signature_index Points to encoded signature
-   * @param attributes Collection of attributes
-   * @param constant_pool Array of constants
-   */
-  public Field(int access_flags, int name_index, int signature_index,
-               Attribute[] attributes, ConstantPool constant_pool)
-  {
-    super(access_flags, name_index, signature_index, attributes, constant_pool);
-  }
+
+    /**
+     * Construct object from file stream.
+     * @param file Input stream
+     */
+    Field(final DataInput file, final ConstantPool constant_pool) throws IOException,
+            ClassFormatException {
+        super(file, constant_pool);
+    }
 
-  /**
-   * Called by objects that are traversing the nodes of the tree implicitely
-   * 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
-   */
-  public void accept(Visitor v) {
-    v.visitField(this);
-  }
 
-  /**
-   * @return constant value associated with this field (may be null)
-   */
-  public final ConstantValue getConstantValue() {
-    for(int i=0; i < attributes_count; i++)
-      if(attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE)
-        return (ConstantValue)attributes[i];
+    /**
+     * @param access_flags Access rights of field
+     * @param name_index Points to field name in constant pool
+     * @param signature_index Points to encoded signature
+     * @param attributes Collection of attributes
+     * @param constant_pool Array of constants
+     */
+    public Field(final int access_flags, final int name_index, final int signature_index, final Attribute[] attributes,
+            final ConstantPool constant_pool) {
+        super(access_flags, name_index, signature_index, attributes, constant_pool);
+    }
 
-    return null;
-  }
 
-  /**
-   * Return string representation close to declaration format,
-   * `public static final short MAX = 100', e.g..
-   *
-   * @return String representation of field, including the signature.
-   */
-  public final String toString() {
-    String name, signature, access; // Short cuts to constant pool
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitely
+     * 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 void accept( final Visitor v ) {
+        v.visitField(this);
+    }
 
-    // Get names from constant pool
-    access    = Utility.accessToString(access_flags);
-    access    = access.equals("")? "" : (access + " ");
-    signature = Utility.signatureToString(getSignature());
-    name      = getName();
 
-    StringBuffer  buf = new StringBuffer(access + signature + " " + name);
-    ConstantValue cv  = getConstantValue();
-
-    if(cv != null)
-      buf.append(" = " + cv);
-
-    for(int i=0; i < attributes_count; i++) {
-      Attribute a = attributes[i];
-
-      if(!(a instanceof ConstantValue))
-        buf.append(" [" + a.toString() + "]");
+    /**
+     * @return constant value associated with this field (may be null)
+     */
+    public final ConstantValue getConstantValue() {
+        for (final Attribute attribute : super.getAttributes()) {
+            if (attribute.getTag() == Const.ATTR_CONSTANT_VALUE) {
+                return (ConstantValue) attribute;
+            }
+        }
+        return null;
     }
 
-    return buf.toString();
-  }
+
+    /**
+     * Return string representation close to declaration format,
+     * `public static final short MAX = 100', e.g..
+     *
+     * @return String representation of field, including the signature.
+     */
+    @Override
+    public final String toString() {
+        String name;
+        String signature;
+        String access; // Short cuts to constant pool
+
+        // Get names from constant pool
+        access = Utility.accessToString(super.getAccessFlags());
+        access = access.isEmpty() ? "" : (access + " ");
+        signature = Utility.signatureToString(getSignature());
+        name = getName();
+        final StringBuilder buf = new StringBuilder(64); // CHECKSTYLE IGNORE MagicNumber
+        buf.append(access).append(signature).append(" ").append(name);
+        final ConstantValue cv = getConstantValue();
+        if (cv != null) {
+            buf.append(" = ").append(cv);
+        }
+        for (final Attribute attribute : super.getAttributes()) {
+            if (!(attribute instanceof ConstantValue)) {
+                buf.append(" [").append(attribute).append("]");
+            }
+        }
+        return buf.toString();
+    }
+
+
+    /**
+     * @return deep copy of this field
+     */
+    public final Field copy( final ConstantPool _constant_pool ) {
+        return (Field) copy_(_constant_pool);
+    }
+
 
-  /**
-   * @return deep copy of this field
-   */
-  public final Field copy(ConstantPool constant_pool) {
-    return (Field)copy_(constant_pool);
-  }
+    /**
+     * @return type of field
+     */
+    public Type getType() {
+        return Type.getReturnType(getSignature());
+    }
+
+
+    /**
+     * @return Comparison strategy object
+     */
+    public static BCELComparator getComparator() {
+        return bcelComparator;
+    }
+
+
+    /**
+     * @param comparator Comparison strategy object
+     */
+    public static void setComparator( final BCELComparator comparator ) {
+        bcelComparator = comparator;
+    }
+
 
-  /**
-   * @return type of field
-   */
-  public Type getType() {
-    return Type.getReturnType(getSignature());
-  }
+    /**
+     * Return value as defined by given BCELComparator strategy.
+     * By default two Field objects are said to be equal when
+     * their names and signatures are equal.
+     *
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals( final Object obj ) {
+        return bcelComparator.equals(this, obj);
+    }
+
+
+    /**
+     * Return value as defined by given BCELComparator strategy.
+     * By default return the hashcode of the field's name XOR signature.
+     *
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return bcelComparator.hashCode(this);
+    }
 }