Example usage for org.objectweb.asm Type getObjectType

List of usage examples for org.objectweb.asm Type getObjectType

Introduction

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

Prototype

public static Type getObjectType(final String internalName) 

Source Link

Document

Returns the Type corresponding to the given internal name.

Usage

From source file:ca.weblite.asm.ASMClassLoaderTest.java

/**
 * Test of findClass method, of class ASMClassLoader.
 *//*  ww  w . j a  va2s .c  o  m*/
@Test
public void testFindClass() throws Exception {
    Type type = Type.getObjectType("java/util/Map");
    ASMClassLoader instance = new ASMClassLoader(new Context(), null);
    instance.setPath(System.getProperty("sun.boot.class.path"));
    ClassNode result = instance.findClass(type);

    assertTrue("Cannot find java.util.Map", result != null);
    assertEquals("Incorrect name for Map", "java/util/Map", result.name);
    assertEquals("Incorrect superclass for Map", "java/lang/Object", result.superName);

}

From source file:ca.weblite.asm.ClassFinder.java

private ClassNode findFQNClass(String name) {
    if (name.indexOf(".") != -1) {
        name = name.replaceAll("\\.", "/");
    }/* ww  w.  j  av  a2  s. com*/
    String origName = name;
    if (classCache.containsKey(name)) {
        return classCache.get(name);
    }

    while (loader != null && true) {
        Type type = Type.getObjectType(name);
        ClassNode node = loader.findClass(Type.getObjectType(name));
        if (node != null) {
            classCache.put(origName, node);
            return node;
        }
        int lastSlash = name.lastIndexOf("/");
        if (lastSlash == -1) {
            break;
        }
        name = name.substring(0, lastSlash) + "$" + name.substring(lastSlash + 1);
    }

    return null;

}

From source file:ca.weblite.asm.ClassFinder.java

private ClassNode findFQNStub(String name) {
    if (name.indexOf(".") != -1) {
        name = name.replaceAll("\\.", "/");
    }//from w  ww  .  j  av  a 2 s.com
    String origName = name;
    if (stubCache.containsKey(name)) {
        return stubCache.get(name);
    }

    while (loader != null && true) {
        ClassNode node = loader.findStub(Type.getObjectType(name));
        if (node != null) {
            stubCache.put(origName, node);
            return node;
        }
        int lastSlash = name.lastIndexOf("/");
        if (lastSlash == -1) {
            break;
        }
        name = name.substring(0, lastSlash) + "$" + name.substring(lastSlash + 1);
    }
    return null;

}

From source file:ca.weblite.asm.JavaExtendedStubCompiler.java

License:Apache License

public List<Type> extractTypes(File sourceFile) throws IOException {
    JavaCompiler compiler = JavacTool.create();
    MyFileObject[] fos = new MyFileObject[] { new MyFileObject(sourceFile) };

    JavacTask task = (JavacTask) compiler.getTask(null, null, null, null, null, Arrays.asList(fos));
    Iterable<? extends CompilationUnitTree> asts = task.parse();
    TreePathScanner scanner;// w  ww  .  j ava2s .com
    final List<Type> types = new ArrayList<Type>();
    scanner = new TreePathScanner() {
        String packageName = "";
        String currPath = "";

        @Override
        public Object visitClass(ClassTree ct, Object p) {
            if (currPath.equals(packageName)) {
                currPath = currPath.length() > 0 ? currPath + "/" + ct.getSimpleName().toString()
                        : ct.getSimpleName().toString();
            } else {
                currPath = currPath + "$" + ct.getSimpleName().toString();
            }

            types.add(Type.getObjectType(currPath));
            Object out = super.visitClass(ct, p);
            int lastSlash = currPath.lastIndexOf("/");
            int lastDollar = currPath.lastIndexOf("$");
            int lastPos = Math.max(lastSlash, lastDollar);
            currPath = lastPos != -1 ? currPath.substring(0, lastPos) : "";
            return out;

        }

        @Override
        public Object visitCompilationUnit(CompilationUnitTree cut, Object p) {
            packageName = cut.getPackageName().toString();
            currPath = packageName.replaceAll("\\.", "/");
            return super.visitCompilationUnit(cut, p);
        }

    };
    scanner.scan(asts, null);
    return types;
}

From source file:ca.weblite.asm.JavaExtendedStubCompiler.java

License:Apache License

public Map<String, byte[]> compile(List<Type> types, File sourceFile) throws IOException {
    final Map<String, byte[]> outMap = new HashMap<>();
    final Set<String> typeNames = (types == null) ? null : new HashSet<String>();
    if (types != null) {
        for (Type type : types) {
            typeNames.add(type.getInternalName());
        }/*from  w ww  . ja  va2  s  . c  o  m*/
    }
    JavaCompiler compiler = JavacTool.create();
    MyFileObject[] fos = new MyFileObject[] { new MyFileObject(sourceFile) };

    JavacTask task = (JavacTask) compiler.getTask(null, null, null, null, null, Arrays.asList(fos));
    Iterable<? extends CompilationUnitTree> asts = task.parse();
    TreePathScanner scanner;

    final LinkedList<ClassFinder> scopeStack = new LinkedList<>();
    scanner = new TreePathScanner() {

        String packageName;
        ClassNode superClass;
        LinkedList<String> stack = new LinkedList<>();
        LinkedList<ClassInfo> classInfoStack = new LinkedList<>();
        LinkedList<ClassWriter> cwStack = new LinkedList<>();
        LinkedList<List<? extends TypeParameterTree>> typeParametersStack = new LinkedList<>();

        @Override
        public Object visitCompilationUnit(CompilationUnitTree cut, Object p) {

            packageName = cut.getPackageName().toString();
            ClassFinder scope = new ClassFinder(context.get(ClassLoader.class), null);
            scopeStack.push(scope);
            scope.addImport(packageName + ".*");
            return super.visitCompilationUnit(cut, p);
        }

        private String getThisInternalName(String simpleName) {
            simpleName = simpleName.replaceAll("\\.", "$");
            StringBuilder sb = new StringBuilder();
            Iterator<String> it = stack.descendingIterator();
            sb.append(packageName.replaceAll("\\.", "/"));
            sb.append("/");

            while (it.hasNext()) {
                sb.append(it.next()).append("$");
            }
            sb.append(simpleName);
            return sb.toString();
        }

        @Override
        public Object visitImport(ImportTree it, Object p) {
            if (!it.isStatic()) {
                String path = it.getQualifiedIdentifier().toString();
                scopeStack.peek().addImport(path);
            }
            return super.visitImport(it, p);
        }

        Object visitConstructor(final MethodTree mt, Object p) {
            ClassWriter classWriter = cwStack.peek();
            List<Type> argTypes = new ArrayList<Type>();
            boolean isVarArgs = false;
            for (VariableTree v : mt.getParameters()) {

                if (v.toString().endsWith("... " + v.getName())) {
                    isVarArgs = true;
                }
                String type = v.getType().toString();
                String fullType = type;
                String signature = null;
                try {
                    signature = TypeUtil.getTypeSignature(type, scopeStack.peek());
                } catch (Throwable t) {
                    System.out.println("Failed to find signature for type");
                }
                if (type.indexOf("<") != -1) {
                    type = type.substring(0, type.indexOf("<"));
                }
                int dim = 0;
                if (TypeUtil.isArrayType(type)) {
                    dim = TypeUtil.getArrayTypeDimension(type);
                    type = TypeUtil.getArrayElementType(type);
                }
                if (TypeUtil.isPrimitiveType(type)) {
                    String descriptor = TypeUtil.getDescriptor(type);
                    argTypes.add(Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim)));
                } else {
                    ClassNode stub = scopeStack.peek().findStub(type);
                    assert stub != null;
                    argTypes.add(Type.getObjectType(stub.name));
                }

            }

            String methodDescriptor = null;
            String methodSignature = null;
            if (argTypes.isEmpty()) {
                methodDescriptor = Type.getMethodDescriptor(Type.getType("V"));
            } else {
                methodDescriptor = Type.getMethodDescriptor(Type.getType("V"), argTypes.toArray(new Type[0]));

            }

            int flags = getFlags(mt.getModifiers().getFlags());
            if (isVarArgs) {
                flags |= Opcodes.ACC_VARARGS;

            }
            classWriter.visitMethod(flags, mt.getName().toString(), methodDescriptor, null, null);
            classInfoStack.peek().numConstructors++;
            return null;
        }

        @Override
        public Object visitMethod(MethodTree mt, Object p) {
            if (mt.getReturnType() == null) {
                // It's a constructor
                return visitConstructor(mt, p);
            } else {
                boolean isVarArgs = false;
                ClassWriter classWriter = cwStack.peek();

                List<Type> argTypes = new ArrayList<>();
                List<String> sigArgTypes = new ArrayList<>();
                for (VariableTree v : mt.getParameters()) {
                    String type = v.getType().toString();
                    if (v.toString().endsWith("... " + v.getName())) {
                        isVarArgs = true;
                    }
                    sigArgTypes.add(type);
                    int dim = 0;
                    if (TypeUtil.isArrayType(type)) {
                        dim = TypeUtil.getArrayTypeDimension(type);
                        type = TypeUtil.getArrayElementType(type);
                    }
                    if (TypeUtil.isPrimitiveType(type)) {
                        String descriptor = TypeUtil.getDescriptor(type);
                        argTypes.add(Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim)));
                    } else {

                        if (isGenericType(type)) {
                            type = "Object";
                        }

                        int arrowPos = type.indexOf("<");
                        if (arrowPos != -1) {
                            type = type.substring(0, arrowPos);
                        }
                        ClassNode stub = scopeStack.peek().findStub(type);
                        if (stub == null) {
                            throw new RuntimeException("Could not find class for " + type);
                        }
                        Type argType = Type.getObjectType(stub.name);
                        argType = Type.getType(TypeUtil.getArrayDescriptor(argType.getInternalName(), dim));
                        argTypes.add(argType);
                    }

                }

                String returnType = mt.getReturnType().toString();
                if (isGenericType(returnType)) {
                    returnType = "Object";
                }

                String methodSignature = null;
                try {
                    methodSignature = TypeUtil.getMethodSignature(scopeStack.peek(), returnType,
                            sigArgTypes.toArray(new String[0]));
                } catch (Exception ex) {
                    System.out.println(
                            "Failed to get signature for method " + mt + " message: " + ex.getMessage());
                }
                int dim = 0;

                Type returnTypeType = null;
                if (TypeUtil.isArrayType(returnType)) {
                    dim = TypeUtil.getArrayTypeDimension(returnType);
                    returnType = TypeUtil.getArrayElementType(returnType);
                    if (isGenericType(returnType)) {
                        returnType = "Object";
                    }

                }
                if (TypeUtil.isPrimitiveType(returnType)) {
                    String descriptor = TypeUtil.getDescriptor(returnType);
                    returnTypeType = Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim));

                } else {
                    int arrowPos = returnType.indexOf("<");
                    if (arrowPos != -1) {
                        returnType = returnType.substring(0, arrowPos);
                    }
                    ClassNode stub = scopeStack.peek().findStub(returnType);
                    if (stub == null) {
                        System.out.println("Type params is " + mt.getTypeParameters());
                        System.out.println("Type kind is " + mt.getReturnType().getKind());
                        throw new RuntimeException("Could not find class for " + returnType);
                    }

                    returnTypeType = Type.getObjectType(stub.name);
                    returnTypeType = Type
                            .getType(TypeUtil.getArrayDescriptor(returnTypeType.getInternalName(), dim));

                }

                String methodDescriptor = null;
                if (argTypes.isEmpty()) {
                    methodDescriptor = Type.getMethodDescriptor(returnTypeType);
                } else {
                    methodDescriptor = Type.getMethodDescriptor(returnTypeType, argTypes.toArray(new Type[0]));
                }

                int flags = getFlags(mt.getModifiers().getFlags());
                if (isVarArgs) {
                    flags |= Opcodes.ACC_VARARGS;
                    //System.out.println("VarArgs "+flags);
                }
                classWriter.visitMethod(flags, mt.getName().toString(), methodDescriptor, methodSignature,
                        null);

            }
            //methodStack.push(mt);
            //Object out= super.visitMethod(mt, p); 
            //methodStack.pop();
            return null;
        }

        //private boolean LinkedList<MethodTree> methodStack  =new LinkedList<>();
        @Override
        public Object visitVariable(VariableTree vt, Object p) {

            ClassWriter classWriter = cwStack.peek();

            String varType = vt.getType().toString();
            if (isGenericType(varType)) {
                varType = "Object";
            }
            String signature = null;
            try {
                signature = TypeUtil.getTypeSignature(varType, scopeStack.peek());
            } catch (Exception ex) {
                System.out.println("Failed to generate signature for type " + varType);
            }
            int dim = 0;

            Type varTypeType = null;
            if (TypeUtil.isArrayType(varType)) {
                dim = TypeUtil.getArrayTypeDimension(varType);
                varType = TypeUtil.getArrayElementType(varType);

            }
            if (TypeUtil.isPrimitiveType(varType)) {
                String descriptor = TypeUtil.getDescriptor(varType);
                varTypeType = Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim));

            } else {
                int arrowPos = varType.indexOf("<");
                if (arrowPos != -1) {
                    varType = varType.substring(0, arrowPos);
                }
                ClassNode stub = scopeStack.peek().findStub(varType);
                if (stub == null) {
                    throw new RuntimeException("Could not find class for " + varType);
                }

                varTypeType = Type.getObjectType(stub.name);
                varTypeType = Type.getType(TypeUtil.getArrayDescriptor(varTypeType.getInternalName(), dim));

            }

            classWriter.visitField(getFlags(vt.getModifiers().getFlags()), vt.getName().toString(),
                    varTypeType.toString(), signature, null);

            return super.visitVariable(vt, p); //To change body of generated methods, choose Tools | Templates.
        }

        boolean isGenericType(String type) {
            for (List<? extends TypeParameterTree> types : typeParametersStack) {
                for (TypeParameterTree tree : types) {
                    if (type.equals(tree.getName().toString())) {
                        return true;
                    }
                }
            }
            return false;
        }

        /**
         * Converts modifier flags from Javac Tree into int flags usable in 
         * TypeMirror
         * @param mods
         * @return 
         */
        int getFlags(Set<Modifier> mods) {
            int flags = 0;
            for (Modifier m : mods) {
                switch (m) {
                case ABSTRACT:
                    flags |= Opcodes.ACC_ABSTRACT;
                    break;
                case FINAL:
                    flags |= Opcodes.ACC_FINAL;
                    break;
                case PRIVATE:
                    flags |= Opcodes.ACC_PRIVATE;
                    break;
                case PROTECTED:
                    flags |= Opcodes.ACC_PROTECTED;
                    break;
                case PUBLIC:

                    flags |= Opcodes.ACC_PUBLIC;
                    break;
                case STATIC:
                    flags |= Opcodes.ACC_STATIC;
                    break;

                }
            }

            return flags;
        }

        @Override
        public Object visitClass(ClassTree ct, Object p) {
            //System.out.println("Visiting class "+ct);
            //System.out.println("Type parameters: "+ct.getTypeParameters());
            typeParametersStack.push(ct.getTypeParameters());
            String simpleName = ct.getSimpleName().toString();
            String internalName = getThisInternalName(simpleName);
            int lastDollar = internalName.lastIndexOf("$");
            String externalName = lastDollar == -1 ? null : internalName.substring(0, lastDollar);
            String supername = "java.lang.Object";
            String[] interfaces = null;
            boolean targetClass = false;
            if (!cwStack.isEmpty()) {
                cwStack.peek().visitInnerClass(internalName, externalName, simpleName,
                        getFlags(ct.getModifiers().getFlags()));
            }

            targetClass = true;
            // This is the one that we'
            //String supername = "java.lang.Object";
            if (ct.getExtendsClause() != null) {
                supername = ct.getExtendsClause().toString().trim();
            }
            String unresolvedSuperName = supername;

            int bracketPos = supername.indexOf("<");
            supername = bracketPos == -1 ? supername : supername.substring(0, bracketPos);
            ClassNode node = scopeStack.peek().findStub(supername);
            if (node == null) {
                throw new RuntimeException("Could not find super stub " + supername);
            }
            supername = node.name;

            String impl = ct.getImplementsClause().toString();
            String[] unresolvedInterfaces = null;
            if (impl != null && !"".equals(impl)) {
                interfaces = impl.split(",");
                unresolvedInterfaces = new String[interfaces.length];
                for (int i = 0; i < interfaces.length; i++) {

                    String iface = interfaces[i];
                    unresolvedInterfaces[i] = interfaces[i];
                    iface = iface.trim();
                    ClassNode inode = scopeStack.peek().findStub(iface);
                    assert inode != null;
                    if (inode == null) {
                        throw new RuntimeException("Could not find stub for interface " + iface);
                    }
                    System.out.println("interface " + iface);
                    interfaces[i] = inode.name;
                }
            }
            String signature = TypeUtil.getClassSignature(scopeStack.peek(), null, unresolvedSuperName,
                    unresolvedInterfaces);
            int flags = getFlags(ct.getModifiers().getFlags());

            switch (ct.getKind()) {
            case INTERFACE:
                flags |= Opcodes.ACC_INTERFACE;
                break;

            case ENUM:
                flags |= Opcodes.ACC_ENUM;
                break;

            }

            ClassWriter classWriter = new ClassWriter(49);
            classWriter.visit(49, flags, internalName, signature, supername, interfaces

            );
            cwStack.push(classWriter);
            classInfoStack.push(new ClassInfo());
            stack.push(simpleName);
            ClassFinder scope = new ClassFinder(context.get(ClassLoader.class), scopeStack.peek());

            scope.addImport(internalName.replaceAll("/", ".").replaceAll("\\$", ".") + ".*"

            );
            scope.addImport(internalName.replaceAll("/", ".").replaceAll("\\$", "."));
            scope.addImport(supername.replaceAll("/", ".").replaceAll("\\$", ".") + ".*"

            );
            scope.addImport(supername.replaceAll("/", ".").replaceAll("\\$", "."));

            if (interfaces != null) {
                for (int i = 0; i < interfaces.length; i++) {
                    scope.addImport(interfaces[i].replaceAll("/", ".").replaceAll("\\$", ".") + ".*"

                    );
                    scope.addImport(interfaces[i].replaceAll("/", ".").replaceAll("\\$", "."));
                }
            }
            for (TypeParameterTree tpTree : ct.getTypeParameters()) {
                //System.out.println("Name: "+tpTree.getName());
                //System.out.println("Kind: "+tpTree.getKind().name());
                //System.out.println("Bounds: "+tpTree.getBounds());
                String bounds = (tpTree.getBounds() != null && !tpTree.getBounds().isEmpty())
                        ? tpTree.getBounds().get(0).toString()
                        : "java.lang.Object";
                scope.addTypeParameter(tpTree.getName().toString(), bounds);
            }
            scopeStack.push(scope);
            Object out = super.visitClass(ct, p);
            stack.pop();
            scopeStack.pop();
            ClassInfo classInfo = classInfoStack.pop();
            if (classInfo.numConstructors == 0) {
                // there are no declared constructors in this class 
                // we need to add a default constructor.
                cwStack.peek().visitMethod(Opcodes.ACC_PUBLIC, "<init>",
                        Type.getMethodDescriptor(Type.getType("V")), null, null);
                classInfo.numConstructors++;
            }

            if (targetClass) {
                byte[] bytes = cwStack.peek().toByteArray();
                outMap.put(internalName, bytes);
                cwStack.pop();
            }

            typeParametersStack.pop();

            return out;
        }

    };
    scanner.scan(asts, null);
    return outMap;
}

From source file:ca.weblite.asm.JavaStubFactoryTest.java

@Test
public void testCreateStub() throws IOException {
    ASMClassLoader loader = new ASMClassLoader(new Context(), null);
    loader.setPath(System.getProperty("sun.boot.class.path"));

    JavaStubFactory factory = new JavaStubFactory(loader.getContext());
    Type type = Type.getObjectType("ca/weblite/asm/SampleJavaClass");
    ClassNode stub = factory.createStub(type, new File("test/ca/weblite/asm/SampleJavaClass.java"));
    assertTrue("Stub is null", stub != null);
    assertEquals("SampleJavaClass has wrong name", "ca/weblite/asm/SampleJavaClass", stub.name);
    assertEquals("SampleJavaClass has wrong superclass", "java/util/ArrayList", stub.superName);

    stub = factory.createStub(Type.getObjectType("ca/weblite/asm/SampleJavaClass$StaticInternalClass"),
            new File("test/ca/weblite/asm/SampleJavaClass.java"));
    assertTrue("Stub is null", stub != null);
    assertEquals("SampleJavaClass$StaticInternalClass has wrong name",
            "ca/weblite/asm/SampleJavaClass$StaticInternalClass", stub.name);
    assertEquals("SampleJavaClass$StaticInternalClass has wrong super name", "java/lang/Object",
            stub.superName);//from   w w w  .j av  a  2 s  .  c  o m

}

From source file:ca.weblite.asm.MirahClassIndexTest.java

@Test
public void testMirahClassIndex() throws IOException {
    MirahClassIndex index = new MirahClassIndex();
    index.setPath("test");
    index.deleteIndex();// w  ww  .  ja va2 s  .c  om
    index.indexFile("ca/weblite/asm/SampleMirahClass.mirah");
    SourceFile sourceFile = index.findSourceFile(Type.getObjectType("ca/weblite/asm/SampleMirahClass"));
    assertTrue("Failed to load source file of SampleMirahClass", sourceFile != null);
    assertEquals("Source file name is wrong", "SampleMirahClass.mirah", sourceFile.file.getName());

    //index.save();

    index = new MirahClassIndex();
    index.setPath("test");
    sourceFile = index.findSourceFile(Type.getObjectType("ca/weblite/asm/SampleMirahClass"));
    assertTrue("Shouldn't have found source file before loading index", sourceFile == null);

    index.indexFile("ca/weblite/asm/SampleMirahClass.mirah");
    index.save();

    index = new MirahClassIndex();
    index.setPath("test");
    sourceFile = index.findSourceFile(Type.getObjectType("ca/weblite/asm/SampleMirahClass"));
    assertTrue("Failed to find file that was already indexed", sourceFile != null);

    assertEquals("Source file name is wrong", "SampleMirahClass.mirah", sourceFile.file.getName());

}

From source file:ca.weblite.asm.MirahClassIndexTest.java

@Test
public void testMirahInterfaceIndex() throws IOException {
    MirahClassIndex index = new MirahClassIndex();
    index.setPath("test");
    index.deleteIndex();/*from  w w w  .  j  av a  2  s  .  c  om*/
    index.indexFile("ca/weblite/asm/SampleMirahInterface.mirah");
    SourceFile sourceFile = index.findSourceFile(Type.getObjectType("ca/weblite/asm/SampleMirahInterface"));
    assertTrue("Failed to load source file of SampleMirahInterface", sourceFile != null);
    assertEquals("Source file name is wrong", "SampleMirahInterface.mirah", sourceFile.file.getName());

    //index.save();

    index = new MirahClassIndex();
    index.setPath("test");
    sourceFile = index.findSourceFile(Type.getObjectType("ca/weblite/asm/SampleMirahInterface"));
    assertTrue("Shouldn't have found source file before loading index", sourceFile == null);

    index.indexFile("ca/weblite/asm/SampleMirahInterface.mirah");
    index.save();

    index = new MirahClassIndex();
    index.setPath("test");
    sourceFile = index.findSourceFile(Type.getObjectType("ca/weblite/asm/SampleMirahInterface"));
    assertTrue("Failed to find file that was already indexed", sourceFile != null);

    assertEquals("Source file name is wrong", "SampleMirahInterface.mirah", sourceFile.file.getName());

}

From source file:ca.weblite.asm.MirahClassLoaderTest.java

@Test
public void testLoadMirahClass() throws IOException {
    Context ctx = new Context();
    ASMClassLoader classLoader = new ASMClassLoader(ctx, null);
    classLoader.setPath(System.getProperty("sun.boot.class.path"));
    Path cachedir = Files.createTempDirectory("cache");

    ASMClassLoader cacheLoader = new ASMClassLoader(new Context(), null);
    cacheLoader.setPath(cachedir.toFile().getPath());

    JavaSourceClassLoader loader = new JavaSourceClassLoader(ctx, classLoader, cacheLoader);

    loader.setPath("test");

    MirahClassLoader mirahLoader = new MirahClassLoader(ctx, loader);
    mirahLoader.setPath("test");
    Path mirahCacheDir = Files.createTempDirectory("mirahcache");
    mirahLoader.setCachePath(mirahCacheDir.toString());

    ClassNode node = mirahLoader.findClass(Type.getObjectType("ca/weblite/asm/SampleMirahClass"));

    assertTrue("Could not find SampleMirahClass", node != null);

    node = mirahLoader.findClass(Type.getObjectType("ca/weblite/asm/SampleMirahClass"));

    assertTrue("Could not find SampleMirahClass 2nd time", node != null);

}

From source file:ca.weblite.asm.MirahClassLoaderTest.java

@Test
public void testLoadMirahInterface() throws IOException {
    Context ctx = new Context();
    ASMClassLoader classLoader = new ASMClassLoader(ctx, null);
    classLoader.setPath(System.getProperty("sun.boot.class.path"));
    Path cachedir = Files.createTempDirectory("cache");

    ASMClassLoader cacheLoader = new ASMClassLoader(new Context(), null);
    cacheLoader.setPath(cachedir.toFile().getPath());

    JavaSourceClassLoader loader = new JavaSourceClassLoader(ctx, classLoader, cacheLoader);

    loader.setPath("test");

    MirahClassLoader mirahLoader = new MirahClassLoader(ctx, loader);
    mirahLoader.setPath("test");
    Path mirahCacheDir = Files.createTempDirectory("mirahcache");
    mirahLoader.setCachePath(mirahCacheDir.toString());

    ClassNode node = mirahLoader.findClass(Type.getObjectType("ca/weblite/asm/SampleMirahInterface"));

    assertTrue("Could not find SampleMirahInterface", node != null);

    node = mirahLoader.findClass(Type.getObjectType("ca/weblite/asm/SampleMirahInterface"));

    assertTrue("Could not find SampleMirahInterface 2nd time", node != null);

}