You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by eb...@apache.org on 2015/02/20 02:23:20 UTC

svn commit: r1661052 - in /commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile: AnnotationEntry.java FieldOrMethod.java JavaClass.java

Author: ebourg
Date: Fri Feb 20 01:23:20 2015
New Revision: 1661052

URL: http://svn.apache.org/r1661052
Log:
Refactored JavaClass and FieldOrMethod to avoid a code duplication in the getAnnotationEntries methods. Thanks to Charles Honton (BCEL-165)

Modified:
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java?rev=1661052&r1=1661051&r2=1661052&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java Fri Feb 20 01:23:20 2015
@@ -22,6 +22,7 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.bcel.Constants;
@@ -149,4 +150,16 @@ public class AnnotationEntry implements
         }
         return result.toString();
     }
+
+    public static AnnotationEntry[] createAnnotationEntries(Attribute[] attrs) {
+        // Find attributes that contain annotation data
+        List<AnnotationEntry> accumulatedAnnotations = new ArrayList<AnnotationEntry>(attrs.length);
+        for (Attribute attribute : attrs) {
+            if (attribute instanceof Annotations) {
+                Annotations runtimeAnnotations = (Annotations) attribute;
+                Collections.addAll(accumulatedAnnotations, runtimeAnnotations.getAnnotationEntries());
+            }
+        }
+        return accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]);
+    }
 }

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java?rev=1661052&r1=1661051&r2=1661052&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java Fri Feb 20 01:23:20 2015
@@ -21,8 +21,6 @@ import java.io.DataInput;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import org.apache.bcel.Constants;
 import org.apache.bcel.classfile.Attribute;
 import org.apache.bcel.classfile.Signature;
@@ -46,10 +44,6 @@ public abstract class FieldOrMethod exte
     private String signatureAttributeString = null;
     private boolean searchedForSignatureAttribute = false;
 
-
-    // Annotations are collected from certain attributes, don't do it more than necessary!
-    private boolean annotationsOutOfDate = true;
-
     FieldOrMethod() {
     }
 
@@ -233,50 +227,16 @@ public abstract class FieldOrMethod exte
     }
 
     /**
-     * Ensure we have unpacked any attributes that contain annotations.
-     * We don't remove these annotation attributes from the attributes list, they
-     * remain there.
-     */
-    private void ensureAnnotationsUpToDate()
-    {
-        if (annotationsOutOfDate)
-        {
-            // Find attributes that contain annotation data
-            Attribute[] attrs = getAttributes();
-            List<AnnotationEntry> accumulatedAnnotations = new ArrayList<AnnotationEntry>();
-            for (Attribute attribute : attrs) {
-                if (attribute instanceof Annotations)
-                {
-                    Annotations annotations = (Annotations) attribute;
-                    for (int j = 0; j < annotations.getAnnotationEntries().length; j++)
-                    {
-                        accumulatedAnnotations.add(annotations
-                                .getAnnotationEntries()[j]);
-                    }
-                }
-            }
-            annotationEntries = accumulatedAnnotations
-                    .toArray(new AnnotationEntry[accumulatedAnnotations.size()]);
-            annotationsOutOfDate = false;
+     * @return Annotations on the field or method
+     */
+    public AnnotationEntry[] getAnnotationEntries() {
+        if (annotationEntries == null) {
+            annotationEntries = AnnotationEntry.createAnnotationEntries(getAttributes());
         }
-    }
-
-    public AnnotationEntry[] getAnnotationEntries()
-    {
-        ensureAnnotationsUpToDate();
+        
         return annotationEntries;
     }
 
-    public void addAnnotationEntry(AnnotationEntry a)
-    {
-        ensureAnnotationsUpToDate();
-        int len = annotationEntries.length;
-        AnnotationEntry[] newAnnotations = new AnnotationEntry[len + 1];
-        System.arraycopy(annotationEntries, 0, newAnnotations, 0, len);
-        newAnnotations[len] = a;
-        annotationEntries = newAnnotations;
-    }
-
     /**
      * Hunts for a signature attribute on the member and returns its contents.  So where the 'regular' signature
      * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector&lt;Ljava/lang/String&gt;;'

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java?rev=1661052&r1=1661051&r2=1661052&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java Fri Feb 20 01:23:20 2015
@@ -73,10 +73,7 @@ public class JavaClass extends AccessFla
     public static final byte ZIP = 3;
     static boolean debug = false; // Debugging on/off
     final static char sep = File.separatorChar; // directory separator
-
-    //  Annotations are collected from certain attributes, don't do it more than necessary!
-    private boolean annotationsOutOfDate = true;
-
+    
     private static BCELComparator _cmp = new BCELComparator() {
 
         public boolean equals( Object o1, Object o2 ) {
@@ -144,7 +141,6 @@ public class JavaClass extends AccessFla
         this.fields = fields;
         this.methods = methods;
         this.attributes = attributes;
-        annotationsOutOfDate = true;
         this.source = source;
         // Get source file name if available
         for (Attribute attribute : attributes) {
@@ -337,24 +333,17 @@ public class JavaClass extends AccessFla
         return attributes;
     }
 
+    /**
+     * @return Annotations on the class
+     */
     public AnnotationEntry[] getAnnotationEntries() {
-          if (annotationsOutOfDate) { 
-              // Find attributes that contain annotation data
-              Attribute[] attrs = getAttributes();
-              List<AnnotationEntry> accumulatedAnnotations = new ArrayList<AnnotationEntry>();
-              for (Attribute attribute : attrs) {
-                if (attribute instanceof Annotations) {                
-                    Annotations runtimeAnnotations = (Annotations)attribute;
-                    for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) {
-                        accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]);
-                    }
-                }
-            }
-              annotations = accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]);
-              annotationsOutOfDate = false;
-          }
-          return annotations;
-      }
+        if (annotations == null) {
+            annotations = AnnotationEntry.createAnnotationEntries(getAttributes());
+        }
+        
+        return annotations;
+    }
+
     /**
      * @return Class name.
      */