private String getFieldType(String owner, String name) {
   if (fieldDescriptions.containsKey(owner)) {
     return fieldDescriptions.get(owner).get(name);
   }
   synchronized (fieldDescriptions) {
     try {
       byte[] classBytes =
           ClassPatchManager.INSTANCE.getPatchedResource(
               owner, map(owner).replace('/', '.'), classLoader);
       if (classBytes == null) {
         return null;
       }
       ClassReader cr = new ClassReader(classBytes);
       ClassNode classNode = new ClassNode();
       cr.accept(
           classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
       Map<String, String> resMap = Maps.newHashMap();
       for (FieldNode fieldNode : (List<FieldNode>) classNode.fields) {
         resMap.put(fieldNode.name, fieldNode.desc);
       }
       fieldDescriptions.put(owner, resMap);
       return resMap.get(name);
     } catch (IOException e) {
       FMLRelaunchLog.log(
           Level.ERROR, e, "A critical exception occured reading a class file %s", owner);
     }
     return null;
   }
 }
 private void findAndMergeSuperMaps(String name) {
   try {
     String superName = null;
     String[] interfaces = new String[0];
     byte[] classBytes =
         ClassPatchManager.INSTANCE.getPatchedResource(name, map(name), classLoader);
     if (classBytes != null) {
       ClassReader cr = new ClassReader(classBytes);
       superName = cr.getSuperName();
       interfaces = cr.getInterfaces();
     }
     mergeSuperMaps(name, superName, interfaces);
   } catch (IOException e) {
     e.printStackTrace();
   }
 }