public void visitEnd() { if (visitor == null) { return; } visitor.visitEnd(); }
public DexAnnotationVisitor visitAnnotation(String name, Visibility visibility) { if (visitor == null) { return null; } return visitor.visitAnnotation(name, visibility); } }
@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(); }
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(); }
public void accept(DexClassVisitor dcv) { DexFieldVisitor fv = dcv.visitField(access, field, cst); if (fv != null) { accept(fv); fv.visitEnd(); } }
public DexAnnotationVisitor visitAnnotation(String name, Visibility visibility) { if (visitor == null) { return null; } return visitor.visitAnnotation(name, visibility); } }
private int acceptField(ByteBuffer in, int lastIndex, DexClassVisitor dcv, Map<Integer, Integer> fieldAnnotationPositions, Object value, int config) { int diff = (int) readULeb128i(in); int field_access_flags = (int) readULeb128i(in); int field_id = lastIndex + diff; Field field = getField(field_id); // ////////////////////////////////////////////////////////////// DexFieldVisitor dfv = dcv.visitField(field_access_flags, field, value); if (dfv != null) { if ((config & SKIP_ANNOTATION) == 0) { Integer annotation_offset = fieldAnnotationPositions.get(field_id); if (annotation_offset != null) { try { read_annotation_set_item(annotation_offset, dfv); } catch (Exception e) { throw new DexException(e, "while accept annotation in field:%s.", field.toString()); } } } dfv.visitEnd(); } // ////////////////////////////////////////////////////////////// return field_id; }
public static void acceptField(SmaliParser.SFieldContext ctx, String className, DexClassVisitor dexClassVisitor) { Field field; Token fieldObj = ctx.fieldObj; if (fieldObj.getType() == SmaliLexer.FIELD_FULL) { field = Utils.parseFieldAndUnescape(fieldObj.getText()); } else { field = Utils.parseFieldAndUnescape(className, fieldObj.getText()); } int access = collectAccess(ctx.sAccList()); Object value = null; SmaliParser.SBaseValueContext vctx = ctx.sBaseValue(); if (vctx != null) { value = parseBaseValue(vctx); } DexFieldVisitor dexFieldVisitor = dexClassVisitor.visitField(access, field, value); if (dexFieldVisitor != null) { acceptAnnotations(ctx.sAnnotation(), dexFieldVisitor); dexFieldVisitor.visitEnd(); } }
@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(); } }
new Field(typeNameDesc, "thiz", "Ljava/lang/Object;"), null).visitEnd(); dcv.visitField(DexConstants.ACC_PRIVATE | DexConstants.ACC_FINAL, new Field(typeNameDesc, "args", "[Ljava/lang/Object;"), null) .visitEnd(); dcv.visitField(DexConstants.ACC_PRIVATE | DexConstants.ACC_FINAL, new Field(typeNameDesc, "idx", "I"), null) .visitEnd();
public void visitEnd() { if (visitor == null) { return; } visitor.visitEnd(); }
public void accept(DexClassVisitor dcv) { DexFieldVisitor fv = dcv.visitField(access, field, cst); if (fv != null) { accept(fv); fv.visitEnd(); } }
private int acceptField(ByteBuffer in, int lastIndex, DexClassVisitor dcv, Map<Integer, Integer> fieldAnnotationPositions, Object value, int config) { int diff = (int) readULeb128i(in); int field_access_flags = (int) readULeb128i(in); int field_id = lastIndex + diff; Field field = getField(field_id); // ////////////////////////////////////////////////////////////// DexFieldVisitor dfv = dcv.visitField(field_access_flags, field, value); if (dfv != null) { if ((config & SKIP_ANNOTATION) == 0) { Integer annotation_offset = fieldAnnotationPositions.get(field_id); if (annotation_offset != null) { try { read_annotation_set_item(annotation_offset, dfv); } catch (Exception e) { throw new DexException(e, "while accept annotation in field:%s.", field.toString()); } } } dfv.visitEnd(); } // ////////////////////////////////////////////////////////////// return field_id; }