@Override public void visitEnd() { objs = null; super.visitEnd(); }
/** * Visits the end of the annotation. */ public void visitEnd() { if (this.visitor != null) { visitor.visitEnd(); } } }
public void accept(DexAnnotationAble av) { DexAnnotationVisitor av1 = av.visitAnnotation(type, visibility); if (av1 != null) { for (Item item : items) { acceptAnnotationItem(av1, item.name, item.value); } av1.visitEnd(); } }
private static void acceptAnnotations(List<SmaliParser.SAnnotationContext> sAnnotationContexts, DexAnnotationAble dexAnnotationAble) { if (dexAnnotationAble == null) { return; } if (sAnnotationContexts.size() > 0) { for (SmaliParser.SAnnotationContext ctx : sAnnotationContexts) { Visibility visibility = Utils.getAnnVisibility(ctx.visibility.getText()); String type = Utils.unEscapeId(ctx.type.getText()); DexAnnotationVisitor dexAnnotationVisitor = dexAnnotationAble.visitAnnotation(type, visibility); if (dexAnnotationVisitor != null) { List<SmaliParser.SAnnotationKeyNameContext> keys = ctx.sAnnotationKeyName(); if (keys.size() > 0) { List<SmaliParser.SAnnotationValueContext> values = ctx.sAnnotationValue(); for (int i = 0; i < keys.size(); i++) { acceptAnnotation(dexAnnotationVisitor, Utils.unEscapeId(keys.get(i).getText()), values.get(i)); } } dexAnnotationVisitor.visitEnd(); } } } }
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); } }
public void visit(String name, Object value) { if (value instanceof Object[]) { DexAnnotationVisitor s = visitArray(name); if (s != null) { for (Object v : (Object[]) value) { s.visit(null, v); } s.visitEnd(); } } else { AnnotationElement ae = newAnnotationElement(name); ae.value = EncodedValue.wrap(cp.wrapEncodedItem(value)); } }
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(); }
@Test public void test() { ASMifierFileV fv = new ASMifierFileV(new File("target/asmftest").toPath(), "a.b"); DexClassVisitor cv = fv.visit(ACC_PUBLIC, "La/f;", "Ljava/lang/Object;", null); DexFieldVisitor f2v = cv.visitField(ACC_PUBLIC, new Field("La/f;", "abc", "I"), null); f2v.visitEnd(); DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La/f;", "zz", new String[0], "I")); DexAnnotationAble pv = mv.visitParameterAnnotation(2); DexAnnotationVisitor dav = pv.visitAnnotation("Leeeff;", Visibility.BUILD); dav.visitEnd(); DexCodeVisitor dcv = mv.visitCode(); dcv.visitConstStmt(Op.FILL_ARRAY_DATA, 0, new int[] { 1, 2, 3 }); dcv.visitStmt0R(Op.RETURN_VOID); dcv.visitEnd(); mv.visitEnd(); cv.visitEnd(); fv.visitEnd(); } }
/** * Visits the end of the annotation. */ public void visitEnd() { if (this.visitor != null) { visitor.visitEnd(); } } }
@Override public void visitEnd() { objs = null; super.visitEnd(); }
public void accept(DexAnnotationAble av) { DexAnnotationVisitor av1 = av.visitAnnotation(type, visibility); if (av1 != null) { for (Item item : items) { acceptAnnotationItem(av1, item.name, item.value); } av1.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); } }
public void visit(String name, Object value) { if (value instanceof Object[]) { DexAnnotationVisitor s = visitArray(name); if (s != null) { for (Object v : (Object[]) value) { s.visit(null, v); } s.visitEnd(); } } else { AnnotationElement ae = newAnnotationElement(name); ae.value = EncodedValue.wrap(cp.wrapEncodedItem(value)); } }
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); } } }
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; aaw.visitEnd(); } else { aw.visit(name, decodeValue);
private void writeField(DexClassVisitor cw, EncodedField encodedField) { Field field = new Field(encodedField.field.clazz.descriptor.stringData.string, encodedField.field.name.stringData.string, encodedField.field.type.descriptor.stringData.string); Object decodeValue = null; if (null != encodedField.staticValue) { decodeValue = decodeValue(encodedField.staticValue); } DexFieldVisitor fw = cw.visitField(encodedField.accessFlags, field, decodeValue); if (null != encodedField.annotationSetItem) { for (AnnotationItem annotationItem : encodedField.annotationSetItem.annotations) { EncodedAnnotation annotation = annotationItem.annotation; DexAnnotationVisitor aw = fw.visitAnnotation(annotation.type.descriptor.stringData.string, annotationItem.visibility); writeAnnotation(aw, annotation); aw.visitEnd(); } } fw.visitEnd(); }