Example usage for org.objectweb.asm AnnotationVisitor AnnotationVisitor

List of usage examples for org.objectweb.asm AnnotationVisitor AnnotationVisitor

Introduction

In this page you can find the example usage for org.objectweb.asm AnnotationVisitor AnnotationVisitor.

Prototype

public AnnotationVisitor(final int api) 

Source Link

Document

Constructs a new AnnotationVisitor .

Usage

From source file:bench.anno.Test.java

License:BSD License

static void printAnnotation(final List annotationList) {

    if (annotationList != null && !annotationList.isEmpty()) {

        AnnotationNode annoNode = null;/* w w  w .  j av a  2 s . c o m*/

        for (final Object annotation : annotationList) {

            annoNode = (AnnotationNode) annotation;

            System.out.println("Annotation Descriptor : " + annoNode.desc);
            System.out.println("Annotation attribute pairs : " + annoNode.values);

            final AnnotationVisitor visitor = new AnnotationVisitor(0) {
                @Override
                public void visit(final String arg0, final Object arg1) {

                }

                @Override
                public AnnotationVisitor visitAnnotation(final String arg0, final String arg1) {
                    return null;
                }

                @Override
                public AnnotationVisitor visitArray(final String arg0) {
                    return null;
                }

                @Override
                public void visitEnd() {

                }

                @Override
                public void visitEnum(final String arg0, final String arg1, final String arg2) {

                }

            };

            // annoNode.accept(visitor);

        }

    } else {

        System.out.println("No annotations found..");

    }

}

From source file:cn.annoreg.asm.InnerClassVisitor.java

License:Open Source License

@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
    if (desc.equals(Type.getDescriptor(SideOnly.class))) {
        //We need to know if it's client only.
        return new AnnotationVisitor(api) {
            @Override/*from  w w w .  j a  v a2s.c o  m*/
            public void visitEnum(String name, String desc, String value) {
                if (value == Side.CLIENT.toString()) {
                    InnerClassVisitor.this.clientOnly = true;
                }
            }
        };
    }
    if (desc.equals(Type.getDescriptor(Registrant.class))) {
        isReg = true;
    }
    return null;
}

From source file:co.paralleluniverse.fibers.instrument.SuspOffsetsAfterInstrClassVisitor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
        final String[] exceptions) {
    if ((access & Opcodes.ACC_NATIVE) == 0 && !isYieldMethod(className, name)) {
        // Bytecode-level AST of a method, being a MethodVisitor itself can be filled through delegation from another visitor
        final MethodNode mn = new MethodNode(access, name, desc, signature, exceptions);

        // Analyze, fill and enqueue method ASTs
        final MethodVisitor outMV = super.visitMethod(access, name, desc, signature, exceptions);

        return new MethodVisitor(ASMAPI, outMV) {
            private Label currLabel = null;
            private int prevOffset = -1;
            private boolean instrumented;
            private boolean optimized = false;
            private int methodStart = -1, methodEnd = -1;

            private List<Integer> suspOffsetsAfterInstrL = new ArrayList<>();
            private int[] suspCallSites = new int[0];

            @Override/*w  w w  .j a va  2 s .  co  m*/
            public AnnotationVisitor visitAnnotation(final String adesc, boolean visible) {
                if (Classes.INSTRUMENTED_DESC.equals(adesc)) {
                    instrumented = true;

                    return new AnnotationVisitor(ASMAPI) { // Only collect info
                        @Override
                        public void visit(String name, Object value) {
                            if (Instrumented.FIELD_NAME_METHOD_START.equals(name))
                                methodStart = (Integer) value;
                            else if (Instrumented.FIELD_NAME_METHOD_END.equals(name))
                                methodEnd = (Integer) value;
                            else if (Instrumented.FIELD_NAME_METHOD_OPTIMIZED.equals(name))
                                optimized = (Boolean) value;
                            else if (Instrumented.FIELD_NAME_SUSPENDABLE_CALL_SITES.equals(name))
                                suspCallSites = (int[]) value;
                            else //noinspection StatementWithEmptyBody
                            if (Instrumented.FIELD_NAME_SUSPENDABLE_CALL_SITES_OFFSETS_AFTER_INSTR.equals(name))
                                ; // Ignore, we're filling it
                            else
                                throw new RuntimeException("Unexpected `@Instrumented` field: " + name);
                        }
                    };
                }

                return super.visitAnnotation(adesc, visible);
            }

            @Override
            public void visitLocalVariable(String name, String desc, String sig, Label lStart, Label lEnd,
                    int slot) {
                super.visitLocalVariable(name, desc, sig, lStart, lEnd, slot);
            }

            @Override
            public void visitLabel(Label label) {
                if (instrumented) {
                    currLabel = label;
                }

                super.visitLabel(label);
            }

            @Override
            public void visitMethodInsn(int opcode, String owner, String name, String desc,
                    boolean isInterface) {
                if (instrumented) {
                    final int type = AbstractInsnNode.METHOD_INSN;
                    if (InstrumentMethod.isSuspendableCall(db, type, opcode, owner, name, desc)
                            && !Classes.STACK_NAME.equals(owner) && // postRestore
                    currLabel != null && currLabel.info instanceof Integer)
                        addLine();
                }

                super.visitMethodInsn(opcode, owner, name, desc, isInterface);
            }

            @Override
            public void visitInvokeDynamicInsn(String name, String desc, Handle handle, Object... objects) {
                if (instrumented) {
                    final int type = AbstractInsnNode.INVOKE_DYNAMIC_INSN;
                    final int opcode = Opcodes.INVOKEDYNAMIC;
                    if (InstrumentMethod.isSuspendableCall(db, type, opcode, handle.getOwner(), name, desc)
                            && !Classes.STACK_NAME.equals(handle.getOwner()) && // postRestore
                    currLabel != null && currLabel.info instanceof Integer)
                        addLine();
                }
                super.visitInvokeDynamicInsn(name, desc, handle, objects);
            }

            @Override
            public void visitEnd() {
                if (instrumented)
                    InstrumentMethod.emitInstrumentedAnn(db, outMV, mn, sourceName, className, optimized,
                            methodStart, methodEnd, suspCallSites, toIntArray(suspOffsetsAfterInstrL));

                super.visitEnd();
            }

            private void addLine() {
                final int currOffset = (Integer) currLabel.info;
                if (currOffset > prevOffset) {
                    suspOffsetsAfterInstrL.add(currOffset);
                    prevOffset = currOffset;
                }
            }
        };
    }

    return super.visitMethod(access, name, desc, signature, exceptions);
}

From source file:com.diffplug.gradle.autosgi.PluginMetadataGen.java

License:Apache License

/** Loads a class by its FQN.  If it's concrete and implements a plugin, then we'll call generatePlugin. */
private void maybeGeneratePlugin(Path path)
        throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
    ClassReader reader = new ClassReader(Files.readAllBytes(path));
    String plugClassName = asmToJava(reader.getClassName());
    Box.Nullable<String> socketClassName = Box.Nullable.ofNull();
    reader.accept(new ClassVisitor(Opcodes.ASM5) {
        @Override/* ww w.  ja v a2s .  c  o m*/
        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
            if (PLUG.equals(desc)) {
                return new AnnotationVisitor(Opcodes.ASM5) {
                    @Override
                    public void visit(String name, Object value) {
                        Preconditions.checkArgument(name.equals("value"),
                                "For @Plug %s, expected 'value' but was '%s'", plugClassName, name);
                        Preconditions.checkArgument(socketClassName.get() == null,
                                "For @Plug %s, multiple annotations: '%s' and '%s'", plugClassName,
                                socketClassName.get(), value);
                        socketClassName.set(((org.objectweb.asm.Type) value).getClassName());
                    }
                };
            } else {
                return null;
            }
        }
    }, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE);
    if (socketClassName.get() == null) {
        return;
    }

    Class<?> plugClass = classLoader.loadClass(plugClassName);
    Class<?> socketClass = classLoader.loadClass(socketClassName.get());
    if (Modifier.isAbstract(plugClass.getModifiers())) {
        throw new IllegalArgumentException(
                "Class " + plugClass + " has @Plug(" + socketClass + ") but it is abstract.");
    }

    String osgiInfContent = generatePlugin(plugClass, socketClass);
    osgiInf.put(plugClass.getName(), osgiInfContent);
}

From source file:com.github.rkaippully.jasm.test.ClassAnnotationsTest.java

License:Apache License

@Test
public void testAnnotations() {

    reader.accept(new ClassVisitor(ASM4) {
        private boolean visibleVisited;
        private boolean invisibleVisited;

        class VisibleAnnotationVisitor extends AnnotationVisitor {

            public VisibleAnnotationVisitor(String desc) {
                super(ASM4);
                assertEquals("javax/annotation/Generated", desc);
            }/*w  w  w . j a  v a  2 s  . co m*/

            @Override
            public void visit(String name, Object value) {
                assertEquals("date", name);
                assertEquals("2001-07-04T12:08:56.235-0700", value);
            }

            @Override
            public void visitEnum(String name, String desc, String value) {
                fail("visitEnum called with name=" + name + ", value=" + value + ", desc = " + desc);
            }

            @Override
            public AnnotationVisitor visitAnnotation(String name, String desc) {
                fail("visitAnnotation called with name=" + name + ", desc = " + desc);
                return null;
            }

            @Override
            public AnnotationVisitor visitArray(String name) {
                assertEquals("value", name);
                return new AnnotationVisitor(ASM4) {
                    private List<Object> arrayEntries = new ArrayList<>(2);

                    @Override
                    public void visit(String name, Object value) {
                        arrayEntries.add(value);
                    }

                    @Override
                    public void visitEnd() {
                        assertEquals(2, arrayEntries.size());
                        assertEquals("codegen1", arrayEntries.get(0));
                        assertEquals("codegen2", arrayEntries.get(1));
                    }
                };
            }

            @Override
            public void visitEnd() {
                visibleVisited = true;
            }
        }

        class InvisibleAnnotationVisitor extends AnnotationVisitor {
            public InvisibleAnnotationVisitor(String desc) {
                super(ASM4);
                assertEquals("java/lang/Deprecated", desc);
            }

            @Override
            public void visit(String name, Object value) {
                fail("visit called with name=" + name + ", value=" + value);
            }

            @Override
            public void visitEnum(String name, String desc, String value) {
                fail("visitEnum called with name=" + name + ", value=" + value + ", desc = " + desc);
            }

            @Override
            public AnnotationVisitor visitAnnotation(String name, String desc) {
                fail("visitAnnotation called with name=" + name + ", desc = " + desc);
                return null;
            }

            @Override
            public AnnotationVisitor visitArray(String name) {
                fail("visitArray called with name=" + name);
                return null;
            }

            @Override
            public void visitEnd() {
                invisibleVisited = true;
            }
        }

        @Override
        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
            if (visible)
                return new VisibleAnnotationVisitor(desc);
            else
                return new InvisibleAnnotationVisitor(desc);
        }

        @Override
        public void visitEnd() {
            assertTrue(visibleVisited);
            assertTrue(invisibleVisited);
        }
    }, 0);
}

From source file:com.google.devtools.j2objc.util.PackageInfoLookup.java

License:Apache License

private PackageData parseDataFromClassFile(InputFile file) throws IOException {
    PackageDataBuilder builder = new PackageDataBuilder();
    ClassReader classReader = new ClassReader(file.getInputStream());
    classReader.accept(new ClassVisitor(Opcodes.ASM5) {
        @Override//from  w w w .ja  v a  2  s .  co  m
        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
            if (desc.equals("Lcom/google/j2objc/annotations/ObjectiveCName;")) {
                return new AnnotationVisitor(Opcodes.ASM5) {
                    @Override
                    public void visit(String name, Object value) {
                        if (name.equals("value")) {
                            builder.setObjectiveCName(value.toString());
                        }
                    }
                };
            } else if (desc.equals("Ljavax/annotation/ParametersAreNonnullByDefault;")) {
                builder.setParametersAreNonnullByDefault();
            } else if (desc.equals("Lcom/google/j2objc/annotations/ReflectionSupport;")) {
                return new AnnotationVisitor(Opcodes.ASM5) {
                    @Override
                    public void visitEnum(String name, String desc, String value) {
                        if (desc.equals("Lcom/google/j2objc/annotations/ReflectionSupport$Level;")
                                && name.equals("value")) {
                            builder.setReflectionSupportLevel(ReflectionSupport.Level.valueOf(value));
                        }
                    }
                };
            }
            return null;
        }
    }, 0);
    return builder.build();
}

From source file:com.google.devtools.j2objc.util.PackagePrefixes.java

License:Apache License

/**
 * Check if there is a package-info class with a prefix annotation.
 *///from www  .ja v  a  2s.  c om
private String getPrefixFromPackageInfoClass(String packageName) {
    final String[] result = new String[1];
    try {
        InputFile file = FileUtil.findOnClassPath(packageName + ".package-info");
        if (file != null) {
            ClassReader classReader = new ClassReader(file.getInputStream());
            classReader.accept(new ClassVisitor(Opcodes.ASM5) {
                @Override
                public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                    if (!desc.equals("Lcom/google/j2objc/annotations/ObjectiveCName;")) {
                        return null;
                    }
                    return new AnnotationVisitor(Opcodes.ASM5) {
                        @Override
                        public void visit(String name, Object value) {
                            if (name.equals("value")) {
                                result[0] = value.toString();
                            }
                        }
                    };
                }
            }, 0);
        }
    } catch (IOException e) {
        // Continue, as there's no package-info to check.
    }
    return result[0];
}

From source file:com.tonicsystems.jarjar.EmptyClassVisitor.java

License:Apache License

@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
    return new AnnotationVisitor(Opcodes.ASM4) {
    };
}

From source file:com.tonicsystems.jarjar.StringReader.java

License:Apache License

@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
    return new AnnotationVisitor(Opcodes.ASM4) {
        @Override/*from w ww  .jav a  2  s  .co  m*/
        public void visit(String name, Object value) {
            handleObject(value);
        }

        @Override
        public void visitEnum(String name, String desc, String value) {
            handleObject(value);
        }

        @Override
        public AnnotationVisitor visitAnnotation(String name, String desc) {
            return this;
        }
    };
}

From source file:com.tonicsystems.jarjar.strings.StringReader.java

License:Apache License

@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
    return new AnnotationVisitor(Opcodes.ASM5) {
        @Override/*from w  ww . ja v a  2 s. co m*/
        public void visit(String name, Object value) {
            handleObject(value);
        }

        @Override
        public void visitEnum(String name, String desc, String value) {
            handleObject(value);
        }

        @Override
        public AnnotationVisitor visitAnnotation(String name, String desc) {
            return this;
        }
    };
}