* for a method in the class. See JVM specification for details.
* A method has access flags, a name, a signature and a number of attributes.
*
- * @version $Id: Method.java,v 1.3 2008/01/25 02:28:23 aclement Exp $
+ * @version $Id: Method.java,v 1.4 2008/01/25 18:33:24 aclement Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public final class Method extends FieldOrMethod {
+ public static final Annotation[][] NO_PARAMETER_ANNOTATIONS = new Annotation[][]{};
+ public static final Annotation[] NO_ANNOTATIONS = new Annotation[]{};
+
private boolean parameterAnnotationsOutOfDate;
- private RuntimeVisibleParameterAnnotations parameterAnnotationsVis; // annotations on parameters of this method
- private RuntimeInvisibleParameterAnnotations parameterAnnotationsInvis;
+ private Annotation[][] unpackedParameterAnnotations;
+
/**
* Empty constructor, all attributes have to be defined via `setXXX'
public Type[] getArgumentTypes() {
return Type.getArgumentTypes(getSignature());
}
-
+
private void ensureParameterAnnotationsUnpacked() {
- if (parameterAnnotationsOutOfDate) {
- // Find attributes that contain annotation data
- Attribute[] attrs = getAttributes();
- List accumulatedAnnotations = new ArrayList();
-
- for (int i = 0; i < attrs.length; i++) {
- Attribute attribute = attrs[i];
- if (attribute instanceof RuntimeVisibleParameterAnnotations) {
- parameterAnnotationsVis = (RuntimeVisibleParameterAnnotations)attribute;
- }
- if (attribute instanceof RuntimeInvisibleParameterAnnotations) {
- parameterAnnotationsInvis = (RuntimeInvisibleParameterAnnotations)attribute;
- }
+ if (!parameterAnnotationsOutOfDate) return;
+ parameterAnnotationsOutOfDate = false;
+
+ int parameterCount = getArgumentTypes().length;
+ if (parameterCount == 0) {
+ unpackedParameterAnnotations = NO_PARAMETER_ANNOTATIONS;
+ return;
+ }
+
+ RuntimeVisibleParameterAnnotations parameterAnnotationsVis = null;
+ RuntimeInvisibleParameterAnnotations parameterAnnotationsInvis = null;
+
+ // Find attributes that contain annotation data
+ Attribute[] attrs = getAttributes();
+ List accumulatedAnnotations = new ArrayList();
+
+ for (int i = 0; i < attrs.length; i++) {
+ Attribute attribute = attrs[i];
+ if (attribute instanceof RuntimeVisibleParameterAnnotations) {
+ parameterAnnotationsVis = (RuntimeVisibleParameterAnnotations)attribute;
+ } else if (attribute instanceof RuntimeInvisibleParameterAnnotations) {
+ parameterAnnotationsInvis = (RuntimeInvisibleParameterAnnotations)attribute;
}
- parameterAnnotationsOutOfDate = false;
- }
+ }
+
+ // Build a list of annotation arrays, one per argument
+ List annotationsForEachParameter = new ArrayList();
+ Annotation[] visibleOnes = null;
+ Annotation[] invisibleOnes = null;
+ boolean foundSome = false;
+ for (int i=0; i<parameterCount; i++) {
+ int count = 0;
+ visibleOnes = new Annotation[0];
+ invisibleOnes = new Annotation[0];
+ if (parameterAnnotationsVis!=null) {
+ visibleOnes = parameterAnnotationsVis.getAnnotationsOnParameter(i);
+ count+=visibleOnes.length;
+ }
+ if (parameterAnnotationsInvis!=null){
+ invisibleOnes = parameterAnnotationsInvis.getAnnotationsOnParameter(i);
+ count+=invisibleOnes.length;
+ }
+
+ Annotation[] complete = NO_ANNOTATIONS;
+ if (count!=0) {
+ complete = new Annotation[visibleOnes.length+invisibleOnes.length];
+ System.arraycopy(visibleOnes,0,complete,0,visibleOnes.length);
+ System.arraycopy(invisibleOnes,0,complete,visibleOnes.length,invisibleOnes.length);
+ foundSome = true;
+ }
+ annotationsForEachParameter.add(complete);
+ }
+ if (foundSome) {
+ unpackedParameterAnnotations = (Annotation[][])annotationsForEachParameter.toArray(new Annotation[][]{});
+ } else {
+ unpackedParameterAnnotations=NO_PARAMETER_ANNOTATIONS;
+ }
}
-
+
public Annotation[] getAnnotationsOnParameter(int i) {
- ensureParameterAnnotationsUnpacked();
-
- Annotation[] visibleOnes = new Annotation[0];
- if (parameterAnnotationsVis!=null) visibleOnes = parameterAnnotationsVis.getAnnotationsOnParameter(i);
- Annotation[] invisibleOnes = new Annotation[0];
- if (parameterAnnotationsInvis!=null) invisibleOnes = parameterAnnotationsInvis.getAnnotationsOnParameter(i);
- Annotation[] complete = new Annotation[visibleOnes.length+invisibleOnes.length];
- System.arraycopy(visibleOnes,0,complete,0,visibleOnes.length);
- System.arraycopy(invisibleOnes,0,complete,visibleOnes.length,invisibleOnes.length);
- return complete;
+ ensureParameterAnnotationsUnpacked();
+ if (unpackedParameterAnnotations==NO_PARAMETER_ANNOTATIONS) return NO_ANNOTATIONS;
+ return unpackedParameterAnnotations[i];
}
public Annotation[][] getParameterAnnotations() {
- int numParams = getArgumentTypes().length;
- Annotation[][] parameterAnnotations = new Annotation[getArgumentTypes().length][];
- for (int i=0; i<numParams; i++) {
- parameterAnnotations[i] = getAnnotationsOnParameter(i);
- }
- return parameterAnnotations;
+ ensureParameterAnnotationsUnpacked();
+ return unpackedParameterAnnotations;
}
}