1 30 package org.objectweb.asm.tree; 31 32 import java.util.ArrayList ; 33 import java.util.List ; 34 35 import org.objectweb.asm.AnnotationVisitor; 36 37 42 public class AnnotationNode implements AnnotationVisitor { 43 44 47 public String desc; 48 49 59 public List values; 60 61 66 public AnnotationNode(final String desc) { 67 this.desc = desc; 68 } 69 70 75 AnnotationNode(final List values) { 76 this.values = values; 77 } 78 79 83 public void visit(final String name, final Object value) { 84 if (values == null) { 85 values = new ArrayList (this.desc != null ? 2 : 1); 86 } 87 if (this.desc != null) { 88 values.add(name); 89 } 90 values.add(value); 91 } 92 93 public void visitEnum( 94 final String name, 95 final String desc, 96 final String value) 97 { 98 if (values == null) { 99 values = new ArrayList (this.desc != null ? 2 : 1); 100 } 101 if (this.desc != null) { 102 values.add(name); 103 } 104 values.add(new String [] { desc, value }); 105 } 106 107 public AnnotationVisitor visitAnnotation( 108 final String name, 109 final String desc) 110 { 111 if (values == null) { 112 values = new ArrayList (this.desc != null ? 2 : 1); 113 } 114 if (this.desc != null) { 115 values.add(name); 116 } 117 AnnotationNode annotation = new AnnotationNode(desc); 118 values.add(annotation); 119 return annotation; 120 } 121 122 public AnnotationVisitor visitArray(final String name) { 123 if (values == null) { 124 values = new ArrayList (this.desc != null ? 2 : 1); 125 } 126 if (this.desc != null) { 127 values.add(name); 128 } 129 List array = new ArrayList (); 130 values.add(array); 131 return new AnnotationNode(array); 132 } 133 134 public void visitEnd() { 135 } 136 137 141 146 public void accept(final AnnotationVisitor av) { 147 if (values != null) { 148 for (int i = 0; i < values.size(); i += 2) { 149 String name = (String ) values.get(i); 150 Object value = values.get(i + 1); 151 accept(av, name, value); 152 } 153 } 154 av.visitEnd(); 155 } 156 157 164 static void accept( 165 final AnnotationVisitor av, 166 final String name, 167 final Object value) 168 { 169 if (value instanceof String []) { 170 String [] typeconst = (String []) value; 171 av.visitEnum(name, typeconst[0], typeconst[1]); 172 } else if (value instanceof AnnotationNode) { 173 AnnotationNode an = (AnnotationNode) value; 174 an.accept(av.visitAnnotation(name, an.desc)); 175 } else if (value instanceof List ) { 176 AnnotationVisitor v = av.visitArray(name); 177 List array = (List ) value; 178 for (int j = 0; j < array.size(); ++j) { 179 accept(v, null, array.get(j)); 180 } 181 v.visitEnd(); 182 } else { 183 av.visit(name, value); 184 } 185 } 186 } 187 | Popular Tags |