List of usage examples for org.objectweb.asm ClassVisitor ClassVisitor
public ClassVisitor(final int api)
From source file:org.codehaus.mojo.animal_sniffer.ClassListBuilder.java
License:Open Source License
protected void process(String name, InputStream image) throws IOException { try {//w w w .jav a 2 s.c o m ClassReader cr = new ClassReader(image); cr.accept(new ClassVisitor(Opcodes.ASM5) { public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { packages.add(name.replace('/', '.')); } }, 0); } catch (ArrayIndexOutOfBoundsException e) { logger.error("Bad class file " + name); // MANIMALSNIFFER-9 it is a pity that ASM does not throw a nicer error on encountering a malformed // class file. IOException ioException = new IOException("Bad class file " + name); ioException.initCause(e); throw ioException; } }
From source file:org.eclipse.ocl.examples.codegen.asm5.ASM5JavaAnnotationReader.java
License:Open Source License
public @Nullable Boolean getIsNonNull(@NonNull Method method) { final String className = method.getDeclaringClass().getName(); final String requiredDesc = getMethodKey(className, method.getName(), Type.getMethodDescriptor(method)); Map<@NonNull Integer, @Nullable Boolean> typeref2state = desc2typerefValue2state.get(requiredDesc); Integer returnTypeReference = TypeReference.newTypeReference(TypeReference.METHOD_RETURN).getValue(); if (typeref2state != null) { return typeref2state.get(returnTypeReference); }//from www . j ava2 s. c om if (!readClasses.add(className)) { return null; } // System.out.println("getIsNonNull: " + requiredDesc + " " + Integer.toHexString(returnTypeReference)); InputStream classStream = null; try { final int flags = ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES | ClassReader.SKIP_CODE; ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); String classFileName = className.replace('.', '/') + ".class"; classStream = contextClassLoader.getResourceAsStream(classFileName); final ClassReader cr = new ClassReader(classStream) { @Override public void accept(ClassVisitor classVisitor, int flags) { super.accept(classVisitor, flags); } @Override public void accept(ClassVisitor classVisitor, Attribute[] attrs, int flags) { super.accept(classVisitor, attrs, flags); } }; ClassVisitor cv = new ClassVisitor(Opcodes.ASM5) { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return null; } @Override public void visitAttribute(Attribute attr) { } @Override public void visitEnd() { } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return null; } @Override public void visitInnerClass(String name, String outerName, String innerName, int access) { } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { final String methodDesc = getMethodKey(className, name, desc);// + " " + signature; // System.out.println(" ClassVisitor.visitMethod: " + methodDesc); final HashMap<@NonNull Integer, @Nullable Boolean> typerefValue2state = new HashMap<@NonNull Integer, @Nullable Boolean>(); desc2typerefValue2state.put(methodDesc, typerefValue2state); return new MethodVisitor(Opcodes.ASM5) { @Override public AnnotationVisitor visitAnnotation(String annotationDesc, boolean visible) { return null; } @Override public AnnotationVisitor visitAnnotationDefault() { return null; } @Override public void visitAttribute(Attribute attr) { } @Override public void visitCode() { } @Override public void visitEnd() { } @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { } @Override public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { } @Override public void visitIincInsn(int var, int increment) { } @Override public void visitInsn(int opcode) { } @Override public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return null; } @Override public void visitIntInsn(int opcode, int operand) { } @Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { } @Override public void visitJumpInsn(int opcode, Label label) { } @Override public void visitLabel(Label label) { } @Override public void visitLdcInsn(Object cst) { } @Override public void visitLineNumber(int line, Label start) { } @Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { } @Override public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, String desc, boolean visible) { return null; } @Override public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { } @Override public void visitMaxs(int maxStack, int maxLocals) { } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { } @Override public void visitMultiANewArrayInsn(String desc, int dims) { } @Override public void visitParameter(String name, int access) { } @Override public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { return null; } @Override public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { } @Override public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return null; } @Override public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { } @Override public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { // System.out.println(" MethodVisitor-TypeAnnotation:" + Integer.toHexString(typeRef) + " " + typePath + " " + desc + " " + visible); // TypeReference typeReference = new TypeReference(typeRef); // System.out.println(" : " + Integer.toHexString(typeReference.getValue()) + ":" + typeReference.getSort() + ":" + typeReference.getTypeParameterIndex()); if (desc.equals(nonNullDesc)) { // System.out.println(" MethodVisitor-TypeAnnotation:" + Integer.toHexString(typeRef) + " " + typePath + " " + desc); typerefValue2state.put(typeRef, true); } else if (desc.equals(nullableDesc)) { // System.out.println(" MethodVisitor-TypeAnnotation:" + Integer.toHexString(typeRef) + " " + typePath + " " + desc); typerefValue2state.put(typeRef, false); } return null; } @Override public void visitTypeInsn(int opcode, String type) { } @Override public void visitVarInsn(int opcode, int var) { } }; } @Override public void visitOuterClass(String owner, String name, String desc) { } @Override public void visitSource(String source, String debug) { } @Override public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { // System.out.println(" ClassVisitor-TypeAnnotation:" + typeRef + " " + typePath + " " + desc + " " + visible); return null; } }; cr.accept(cv, flags); } catch (IOException e) { logger.error("Failed to read '" + className + "'", e); } finally { if (classStream != null) { try { classStream.close(); } catch (IOException e) { } } } typeref2state = desc2typerefValue2state.get(requiredDesc); if (typeref2state == null) { return null; } Boolean state = typeref2state.get(returnTypeReference); // System.out.println(" => " + state); return state; }
From source file:org.ehcache.impl.internal.store.offheap.AssertingOffHeapValueHolder.java
License:Apache License
private static boolean isLockedInFrame(StackTraceElement ste) { try {//from ww w .j a v a 2 s .c om ClassReader reader = new ClassReader(ste.getClassName()); NavigableMap<Integer, Integer> lockLevels = new TreeMap<>(); reader.accept(new ClassVisitor(ASM6) { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { if (ste.getMethodName().equals(name)) { return new InstructionAdapter(ASM6, new MethodVisitor(ASM6) { }) { private final Map<Label, Integer> levels = new HashMap<>(); private int lockLevel; @Override public void invokeinterface(String owner, String name, String descriptor) { if (LOCK_CLASS.equals(getObjectType(owner))) { if (LOCK_METHOD.equals(new Method(name, descriptor))) { lockLevel++; } else if (UNLOCK_METHOD.equals(new Method(name, descriptor))) { lockLevel--; } } } @Override public void visitJumpInsn(int opcode, Label label) { levels.merge(label, lockLevel, Integer::max); } @Override public void visitLabel(Label label) { lockLevel = levels.merge(label, lockLevel, Integer::max); } @Override public void visitLineNumber(int line, Label start) { lockLevels.merge(line, levels.get(start), Integer::max); } }; } else { return null; } } }, 0); Map.Entry<Integer, Integer> entry = lockLevels.floorEntry(ste.getLineNumber()); return entry.getValue() > 0; } catch (IOException e) { throw new AssertionError(e); } }
From source file:org.fluidity.composition.maven.AbstractAnnotationProcessorMojo.java
License:Apache License
@SuppressWarnings({ "ResultOfMethodCallIgnored", "MismatchedQueryAndUpdateOfCollection" }) private void processClasses(final Logger log, final ClassLoader loader, final File classesDirectory, final Map<String, Map<String, Collection<String>>> serviceProviderMap, final Map<String, Collection<String>> componentMap, final Map<String, Collection<String>> componentGroupMap) throws IOException, ClassNotFoundException, MojoExecutionException { final DirectoryScanner scanner = new DirectoryScanner(); scanner.setBasedir(classesDirectory); scanner.setIncludes(new String[] { "**/*.class" }); scanner.addDefaultExcludes();/*from www.java 2 s . c om*/ scanner.scan(); final ClassRepository repository = new ClassRepository(loader); final Set<String> publicApis = new HashSet<>(); final Map<String, Collection<String>> serviceProviders = new HashMap<>(); for (final String fileName : scanner.getIncludedFiles()) { final String className = fileName.substring(0, fileName.length() - ClassLoaders.CLASS_SUFFIX.length()) .replace(File.separatorChar, '.'); final String componentPackage = className.substring(0, className.lastIndexOf(".") + 1); final String bindingClassName = componentPackage + GENERATED_PACKAGE_BINDINGS + projectName; if (className.equals(bindingClassName)) { new File(classesDirectory, fileName).delete(); } else { final ClassReader classData = repository.reader(className); assert classData != null : className; final Map<String, Set<String>> serviceProviderApis = new HashMap<>(); class ClassFlags { boolean ignored; boolean component; boolean group; boolean dependent; Type scope; } final ClassFlags flags = new ClassFlags(); final ClassProcessor processor = new ClassProcessor() { public ClassVisitor visitor(final ClassReader reader) { return new ClassVisitor(ASM5) { private final Type serviceProviderType = Type.getType(ServiceProvider.class); private final Type componentType = Type.getType(Component.class); private final Type componentGroupType = Type.getType(ComponentGroup.class); private final String name = ClassReaders.internalName(className); private boolean original; @Override public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) { original = this.name.equals(name); super.visit(version, access, name, signature, superName, interfaces); } @Override public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) { if ((access & Opcodes.ACC_SYNTHETIC) != 0) { flags.dependent = name.startsWith("this$"); } return super.visitField(access, name, desc, signature, value); } @Override public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) { final Type type = Type.getType(desc); if (serviceProviderType.equals(type)) { return new ServiceProviderProcessor(repository, reader, processor -> { final String _type = processor.type(); Set<String> list = serviceProviderApis.get(_type); if (list == null) { serviceProviderApis.put(_type, list = new HashSet<>()); } list.addAll(processor.apiSet()); if (_type.equals(ServiceProviders.TYPE)) { publicApis.addAll(list); } }); } else if (componentType.equals(type)) { return new ComponentProcessor(processor -> { if (original) { flags.ignored = !processor.isAutomatic(); flags.scope = processor.scope(); } flags.component = !ClassReaders.isAbstract(classData) && !ClassReaders.isInterface(classData); }); } else if (componentGroupType.equals(type)) { return new ComponentProcessor(processor -> flags.group = !flags.dependent); } else { return null; } } }; } public boolean run(final ClassReader classData) throws IOException, MojoExecutionException { try { classData.accept(visitor(classData), ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES | ClassReader.SKIP_CODE); // components and service providers are always concrete classes that can be instantiated on their own final boolean instantiable = !ClassReaders.isAbstract(classData); if (instantiable) { processAncestry(this, classData, repository); } return instantiable; } catch (final Exceptions.Wrapper e) { throw e.rethrow(IOException.class).rethrow(MojoExecutionException.class); } } }; if (processClass(classData, processor)) { final Map<String, Collection<String>> providerMap = providerMap(PackageBindings.SERVICE_TYPE, serviceProviderMap); final String externalName = ClassReaders.externalName(classData); if (flags.scope != null) { if (flags.ignored) { log.warn("Superfluous 'automatic = false' setting for scoped component %s", externalName); } addServiceProvider(providerMap(Component.SCOPE, serviceProviderMap), flags.scope.getClassName(), externalName); } else if (!flags.ignored) { if (flags.component) { addBinding(bindingClassName, externalName, providerMap, componentMap); } if (flags.group) { addBinding(bindingClassName, externalName, providerMap, componentGroupMap); } } if (!flags.dependent) { for (final Map.Entry<String, Set<String>> entry : serviceProviderApis.entrySet()) { final Set<String> providerNames = entry.getValue(); addServiceProviders(className, providerNames, providerMap(entry.getKey(), serviceProviderMap)); for (final String api : providerNames) { addServiceProvider(serviceProviders, api, className); } } } } } } for (final String className : publicApis) { final Collection<String> providers = serviceProviders.get(className); if (providers != null) { for (final String provider : providers) { makePublic(provider, classesDirectory, repository); } } else { assert ClassReaders.isAbstract(repository.reader(ClassReaders.externalName(className))) : className; } } }
From source file:org.gradle.language.base.internal.tasks.apigen.ApiStubGenerator.java
License:Apache License
private boolean belongsToApi(ClassReader cr) { final AtomicBoolean isAPI = new AtomicBoolean(); cr.accept(new ClassVisitor(Opcodes.ASM5) { @Override// w w w . j av a 2s . c o m public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { String className = toClassName(name); isAPI.set(memberOfApiChecker.belongsToApi(className) && isPublicAPI(access) && !AIC_LOCAL_CLASS_PATTERN.matcher(name).matches()); } }, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); return isAPI.get(); }
From source file:org.gridgain.grid.kernal.processors.hadoop.GridHadoopClassLoader.java
License:Open Source License
/** * @param clsName Class name.//w ww. jav a 2 s.com * @return {@code true} If the class has external dependencies. */ boolean hasExternalDependencies(final String clsName, final Set<String> visited) { if (isHadoop(clsName)) // Hadoop must not be in classpath but Idea sucks, so filtering explicitly as external. return true; // Try to get from parent to check if the type accessible. InputStream in = loadClassBytes(getParent(), clsName); if (in == null) // The class is external itself, it must be loaded from this class loader. return true; if (!isGgfsOrGgHadoop(clsName)) // Other classes should not have external dependencies. return false; final ClassReader rdr; try { rdr = new ClassReader(in); } catch (IOException e) { throw new RuntimeException("Failed to read class: " + clsName, e); } visited.add(clsName); final AtomicBoolean hasDeps = new AtomicBoolean(); rdr.accept(new ClassVisitor(Opcodes.ASM4) { AnnotationVisitor av = new AnnotationVisitor(Opcodes.ASM4) { // TODO }; FieldVisitor fv = new FieldVisitor(Opcodes.ASM4) { @Override public AnnotationVisitor visitAnnotation(String desc, boolean b) { onType(desc); return av; } }; MethodVisitor mv = new MethodVisitor(Opcodes.ASM4) { @Override public AnnotationVisitor visitAnnotation(String desc, boolean b) { onType(desc); return av; } @Override public AnnotationVisitor visitParameterAnnotation(int i, String desc, boolean b) { onType(desc); return av; } @Override public AnnotationVisitor visitAnnotationDefault() { return av; } @Override public void visitFieldInsn(int i, String owner, String name, String desc) { onType(owner); onType(desc); } @Override public void visitFrame(int i, int i2, Object[] locTypes, int i3, Object[] stackTypes) { for (Object o : locTypes) { if (o instanceof String) onType((String) o); } for (Object o : stackTypes) { if (o instanceof String) onType((String) o); } } @Override public void visitLocalVariable(String name, String desc, String signature, Label lb, Label lb2, int i) { onType(desc); } @Override public void visitMethodInsn(int i, String owner, String name, String desc) { onType(owner); } @Override public void visitMultiANewArrayInsn(String desc, int dim) { onType(desc); } @Override public void visitTryCatchBlock(Label lb, Label lb2, Label lb3, String e) { onType(e); } }; void onClass(String depCls) { assert validateClassName(depCls) : depCls; if (depCls.startsWith("java.")) // Filter out platform classes. return; if (visited.contains(depCls)) return; Boolean res = cache.get(depCls); if (res == Boolean.TRUE || (res == null && hasExternalDependencies(depCls, visited))) hasDeps.set(true); } void onType(String type) { if (type == null) return; int off = 0; while (type.charAt(off) == '[') off++; // Handle arrays. if (off != 0) type = type.substring(off); if (type.length() == 1) return; // Get rid of primitives. if (type.charAt(type.length() - 1) == ';') { assert type.charAt(0) == 'L' : type; type = type.substring(1, type.length() - 1); } type = type.replace('/', '.'); onClass(type); } @Override public void visit(int i, int i2, String name, String signature, String superName, String[] ifaces) { onType(superName); if (ifaces != null) { for (String iface : ifaces) onType(iface); } } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { onType(desc); return av; } @Override public void visitInnerClass(String name, String outerName, String innerName, int i) { onType(name); } @Override public FieldVisitor visitField(int i, String name, String desc, String signature, Object val) { onType(desc); return fv; } @Override public MethodVisitor visitMethod(int i, String name, String desc, String signature, String[] exceptions) { if (exceptions != null) { for (String e : exceptions) onType(e); } return mv; } }, 0); if (hasDeps.get()) // We already know that we have dependencies, no need to check parent. return true; // Here we are known to not have any dependencies but possibly we have a parent which have them. int idx = clsName.lastIndexOf('$'); if (idx == -1) // No parent class. return false; String parentCls = clsName.substring(0, idx); if (visited.contains(parentCls)) return false; Boolean res = cache.get(parentCls); if (res == null) res = hasExternalDependencies(parentCls, visited); return res; }
From source file:org.h2.test.unit.TestKeywords.java
License:Mozilla Public License
@Override public void test() throws Exception { final HashSet<String> set = new HashSet<>(); ClassReader r = new ClassReader(Parser.class.getResourceAsStream("Parser.class")); r.accept(new ClassVisitor(Opcodes.ASM6) { @Override/*from w w w.ja v a 2 s . co m*/ public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) { add(set, value); return null; } @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { return new MethodVisitor(Opcodes.ASM6) { @Override public void visitLdcInsn(Object value) { add(set, value); } }; } void add(HashSet<String> set, Object value) { if (!(value instanceof String)) { return; } String s = (String) value; int l = s.length(); if (l == 0 || ParserUtil.getSaveTokenType(s, false, 0, l, true) != ParserUtil.IDENTIFIER) { return; } for (int i = 0; i < l; i++) { char ch = s.charAt(i); if ((ch < 'A' || ch > 'Z') && ch != '_') { return; } } set.add(s); } }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:keywords")) { Statement stat = conn.createStatement(); for (String s : set) { // _ROWID_ is a special virtual column String column = s.equals("_ROWID_") ? "C" : s; try { stat.execute("CREATE TABLE " + s + '(' + column + " INT)"); stat.execute("INSERT INTO " + s + '(' + column + ") VALUES (10)"); try (ResultSet rs = stat.executeQuery("SELECT " + column + " FROM " + s)) { assertTrue(rs.next()); assertEquals(10, rs.getInt(1)); assertFalse(rs.next()); } } catch (Throwable t) { throw new AssertionError(s + " cannot be used as identifier.", t); } } } }
From source file:org.jacoco.cli.internal.commands.InstrumentTest.java
License:Open Source License
private void assertInstrumented(File classfile) throws IOException { InputStream in = new FileInputStream(classfile); final ClassReader reader = InstrSupport.classReaderFor(InputStreams.readFully(in)); in.close();/*from w w w . j a v a 2 s .c o m*/ final Set<String> methods = new HashSet<String>(); reader.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION) { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { methods.add(name); return null; } }, 0); assertTrue(methods.contains("$jacocoInit")); }
From source file:org.jacoco.core.instr.ClassFileVersionsTest.java
License:Open Source License
private void assertFrames(byte[] source, final boolean expected) { InstrSupport.classReaderFor(source).accept(new ClassVisitor(InstrSupport.ASM_API_VERSION) { @Override/*from w w w .j av a2 s .c o m*/ public MethodVisitor visitMethod(int access, String name, final String desc, String signature, String[] exceptions) { return new MethodVisitor(InstrSupport.ASM_API_VERSION) { boolean frames = false; @Override public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { frames = true; } @Override public void visitEnd() { if (CondyProbeArrayStrategy.B_DESC.equals(desc)) { assertFalse("CondyProbeArrayStrategy does not need frames", frames); } else { assertEquals(Boolean.valueOf(expected), Boolean.valueOf(frames)); } } }; } }, 0); }
From source file:org.jacoco.core.internal.instr.ClassInstrumenterTest.java
License:Open Source License
@Before public void setup() { runtime = new LoggerRuntime(); instrumenter = new ClassInstrumenter(123, runtime, new ClassVisitor(Opcodes.ASM4) { });//w w w.j av a 2s . co m }