public DexAnnotationVisitor visitArray(String name) { if (visitor != null) { return visitor.visitArray(name); } return null; }
public static void doAccept(DexAnnotationVisitor dexAnnotationVisitor, String k, Object value) { if (value instanceof ArrayList) { DexAnnotationVisitor a = dexAnnotationVisitor.visitArray(k); for (Object o : (ArrayList) value) { doAccept(a, null, o); } a.visitEnd(); } else if (value instanceof Ann) { Ann ann = (Ann) value; DexAnnotationVisitor a = dexAnnotationVisitor.visitAnnotation(k, ann.name); for (Map.Entry<String, Object> e : ann.elements) { doAccept(a, e.getKey(), e.getValue()); } a.visitEnd(); } else if (value instanceof Field) { Field f = (Field) value; dexAnnotationVisitor.visitEnum(k, f.getOwner(), f.getName()); } else { dexAnnotationVisitor.visit(k, value); } }
DexAnnotationVisitor annotationVisitor = dexAnnotationVisitor.visitArray(name); if (annotationVisitor != null) { for (SmaliParser.SAnnotationValueContext annotationValueContext : arrayValueContext
public static void acceptAnnotationItem(DexAnnotationVisitor dav, String name, Object o) { if (o instanceof Object[]) { DexAnnotationVisitor arrayVisitor = dav.visitArray(name); if (arrayVisitor != null) { Object[] array = (Object[]) o; for (Object e : array) { acceptAnnotationItem(arrayVisitor, null, e); } arrayVisitor.visitEnd(); } } else if (o instanceof DexAnnotationNode) { DexAnnotationNode ann = (DexAnnotationNode) o; DexAnnotationVisitor av = dav.visitAnnotation(name, ann.type); if (av != null) { for (DexAnnotationNode.Item item : ann.items) { acceptAnnotationItem(av, item.name, item.value); } av.visitEnd(); } } else if (o instanceof Field) { Field f = (Field) o; dav.visitEnum(name, f.getType(), f.getName()); } else { dav.visit(name, o); } }
@Test public void test3() { DexFileWriter w = new DexFileWriter(); DexClassVisitor cv = w.visit(0x1, "La/c;", null, new String[]{"Ljava/lang/Comparable;"}); cv.visitSource("c.java"); cv.visitAnnotation("LAnn;", Visibility.SYSTEM).visitEnd(); DexFieldVisitor fv = cv.visitField(ACC_PUBLIC | ACC_STATIC, new Field("La/c;", "a", "I"), 55); fv.visitAnnotation("LE;", Visibility.RUNTIME).visitEnd(); fv.visitEnd(); DexMethodVisitor mv = cv.visitMethod(ACC_STATIC, new Method("La/c;", "bb", new String[]{"I"}, "V")); mv.visitAnnotation("Laaa;", Visibility.RUNTIME).visitEnd(); DexAnnotationVisitor dav = mv.visitParameterAnnotation(0).visitAnnotation("Laaa;", Visibility.RUNTIME); dav.visit("abc", true); DexAnnotationVisitor dav2 = dav.visitArray("efg"); dav2.visit("", "123"); dav2.visit("", "456"); dav2.visitEnd(); dav.visitEnd(); DexCodeVisitor code = mv.visitCode(); code.visitRegister(2); code.visitStmt0R(Op.RETURN_VOID); code.visitEnd(); mv.visitEnd(); cv.visitEnd(); w.visitEnd(); w.toByteArray(); }
if (av00 != null) { DexAnnotationVisitor av01 = av00.visitArray("value"); if (av01 != null) { av01.visit(null, new DexType("Lorg/apache/commons/net/MalformedServerReplyException;"));
public DexAnnotationVisitor visitArray(String name) { if (visitor != null) { return visitor.visitArray(name); } return null; }
private void writeAnnotationArrayValue(DexAnnotationVisitor aw, EncodedArray array) { for (EncodedValue value : array.values) { String name = null; Object decodeValue = decodeValue(value); if (value.valueType == VALUE_ENUM) { Field field = (Field) decodeValue; aw.visitEnum(name, field.getOwner(), field.getName()); } else if (decodeValue instanceof EncodedAnnotation) { EncodedAnnotation aannotation = (EncodedAnnotation) decodeValue; DexAnnotationVisitor aaw = aw.visitAnnotation(name, aannotation.type.descriptor.stringData.string); writeAnnotation(aaw, aannotation); aaw.visitEnd(); } else if (decodeValue instanceof EncodedArray) { DexAnnotationVisitor aaw = aw.visitArray(name); writeAnnotationArrayValue(aaw, (EncodedArray) decodeValue); aaw.visitEnd(); } else if (decodeValue instanceof Object[]) { Object[] values = (Object[]) decodeValue; EncodedArray aarray = new EncodedArray(); for (Object avalue : values) { aarray.values.add(EncodedValue.wrap(mFw.cp.wrapEncodedItem(avalue))); } DexAnnotationVisitor aaw = aw.visitArray(name); writeAnnotationArrayValue(aaw, aarray); aaw.visitEnd(); } else { aw.visit(name, decodeValue); } } }
aaw.visitEnd(); } else if (decodeValue instanceof EncodedArray) { DexAnnotationVisitor aaw = aw.visitArray(name); writeAnnotationArrayValue(aaw, (EncodedArray) decodeValue); aaw.visitEnd(); array.values.add(EncodedValue.wrap(mFw.cp.wrapEncodedItem(value))); DexAnnotationVisitor aaw = aw.visitArray(name); writeAnnotationArrayValue(aaw, array); aaw.visitEnd();
public static void acceptAnnotationItem(DexAnnotationVisitor dav, String name, Object o) { if (o instanceof Object[]) { DexAnnotationVisitor arrayVisitor = dav.visitArray(name); if (arrayVisitor != null) { Object[] array = (Object[]) o; for (Object e : array) { acceptAnnotationItem(arrayVisitor, null, e); } arrayVisitor.visitEnd(); } } else if (o instanceof DexAnnotationNode) { DexAnnotationNode ann = (DexAnnotationNode) o; DexAnnotationVisitor av = dav.visitAnnotation(name, ann.type); if (av != null) { for (DexAnnotationNode.Item item : ann.items) { acceptAnnotationItem(av, item.name, item.value); } av.visitEnd(); } } else if (o instanceof Field) { Field f = (Field) o; dav.visitEnum(name, f.getType(), f.getName()); } else { dav.visit(name, o); } }