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