• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.internal.bytecode;
2 
3 import java.util.Map;
4 import java.util.concurrent.ConcurrentHashMap;
5 import org.objectweb.asm.ClassReader;
6 import org.objectweb.asm.tree.ClassNode;
7 
8 public abstract class ClassNodeProvider {
9   private final Map<String, ClassNode> classNodes = new ConcurrentHashMap<>();
10 
getClassBytes(String className)11   protected abstract byte[] getClassBytes(String className) throws ClassNotFoundException;
12 
getClassNode(String internalClassName)13   ClassNode getClassNode(String internalClassName) throws ClassNotFoundException {
14     ClassNode classNode = classNodes.get(internalClassName);
15     if (classNode == null) {
16       classNode = createClassNode(internalClassName);
17       classNodes.put(internalClassName, classNode);
18     }
19     return classNode;
20   }
21 
createClassNode(String internalClassName)22   private ClassNode createClassNode(String internalClassName) throws ClassNotFoundException {
23     byte[] byteCode = getClassBytes(internalClassName);
24     ClassReader classReader = new ClassReader(byteCode);
25     ClassNode classNode = new ClassNode();
26     classReader.accept(classNode,
27         ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
28     return classNode;
29   }
30 
31 }
32