private void collectClassesAndInterfaces(Set<String> classesAndInterfaces, ClassLoader classLoader, String className) { if (className == null || "java/lang/Object".equals(className)) { return; } try (InputStream is = classLoader.getResourceAsStream(className.replace('.', '/') + ".class")) { ClassReader classReader = new ClassReader(is); classReader.accept(new ClassVisitor(useASMExperimental ? Opcodes.ASM7_EXPERIMENTAL : Opcodes.ASM6) { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { if (interfaces != null) { for (String interfaceName : interfaces) { classesAndInterfaces.add(interfaceName); collectClassesAndInterfaces(classesAndInterfaces, classLoader, interfaceName); } } classesAndInterfaces.add(superName); collectClassesAndInterfaces(classesAndInterfaces, classLoader, superName); } @Override public void visitInnerClass(String name, String outerName, String innerName, int access) { if (innerName != null) { classesAndInterfaces.add(innerName); } } }, 0); } catch (IOException e) { logger.warn("Unable to open class file %1$s", className, e); } }