< prev index next >

src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java

Print this page

        

@@ -19,114 +19,185 @@
  * limitations under the License.
  */
 
 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 {
+
+    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();
+        }
+    };
+
+
   /**
    * Initialize from another object. Note that both objects use the same
    * references (shallow copy). Use clone() for a physical copy.
    */
-  public Field(Field c) {
+    public Field(final Field c) {
     super(c);
   }
 
+
   /**
    * Construct object from file stream.
    * @param file Input stream
    */
-  Field(DataInputStream file, ConstantPool constant_pool)
-       throws IOException, ClassFormatException
-  {
+    Field(final DataInput file, final ConstantPool constant_pool) throws IOException,
+            ClassFormatException {
     super(file, constant_pool);
   }
 
+
   /**
    * @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)
-  {
+    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);
   }
 
+
   /**
    * 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) {
+    @Override
+    public void accept( final 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];
-
+        for (final Attribute attribute : super.getAttributes()) {
+            if (attribute.getTag() == Const.ATTR_CONSTANT_VALUE) {
+                return (ConstantValue) attribute;
+            }
+        }
     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.
    */
+    @Override
   public final String toString() {
-    String name, signature, access; // Short cuts to constant pool
+        String name;
+        String signature;
+        String access; // Short cuts to constant pool
 
     // Get names from constant pool
-    access    = Utility.accessToString(access_flags);
-    access    = access.equals("")? "" : (access + " ");
+        access = Utility.accessToString(super.getAccessFlags());
+        access = access.isEmpty() ? "" : (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() + "]");
+        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(ConstantPool constant_pool) {
-    return (Field)copy_(constant_pool);
+    public final Field copy( final 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 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);
+    }
 }
< prev index next >