content: package com.alibaba.fastjson.util;
  
  import java.lang.reflect.Constructor;
  import java.lang.reflect.Field;
  import java.lang.reflect.Method;
  import java.lang.reflect.Type;
  
  public class ASMUtils {
  
      public static boolean isAndroid(String vmName) {
          return "Dalvik".equals(vmName) 
                  || "Lemur".equals(vmName) // aliyun-vm name
                  ;
      }
  
      public static boolean isAndroid() {
          return isAndroid(System.getProperty("java.vm.name"));
      }
  
      public static String getDesc(Method method) {
          StringBuffer buf = new StringBuffer();
          buf.append("(");
          java.lang.Class<?>[] types = method.getParameterTypes();
          for (int i = 0; i < types.length; ++i) {
              buf.append(getDesc(types[i]));
          }
          buf.append(")");
          buf.append(getDesc(method.getReturnType()));
          return buf.toString();
      }
  
      public static String getDesc(Constructor<?> constructor) {
          StringBuffer buf = new StringBuffer();
          buf.append("(");
          java.lang.Class<?>[] types = constructor.getParameterTypes();
          for (int i = 0; i < types.length; ++i) {
              buf.append(getDesc(types[i]));
          }
          buf.append(")V");
          return buf.toString();
      }
  
      public static String getDesc(Class<?> returnType) {
          if (returnType.isPrimitive()) {
              return getPrimitiveLetter(returnType);
          } else if (returnType.isArray()) {
              return "[" + getDesc(returnType.getComponentType());
          } else {
              return "L" + getType(returnType) + ";";
          }
      }
  
      public static String getType(Class<?> parameterType) {
          if (parameterType.isArray()) {
              return "[" + getDesc(parameterType.getComponentType());
          } else {
              if (!parameterType.isPrimitive()) {
                  String clsName = parameterType.getName();
                  return clsName.replaceAll("\\.", "/");
              } else {
                  return getPrimitiveLetter(parameterType);
              }
          }
      }
  
      public static String getPrimitiveLetter(Class<?> type) {
          if (Integer.TYPE.equals(type)) {
              return "I";
          } else if (Void.TYPE.equals(type)) {
              return "V";
          } else if (Boolean.TYPE.equals(type)) {
              return "Z";
          } else if (Character.TYPE.equals(type)) {
              return "C";
          } else if (Byte.TYPE.equals(type)) {
              return "B";
          } else if (Short.TYPE.equals(type)) {
              return "S";
          } else if (Float.TYPE.equals(type)) {
              return "F";
          } else if (Long.TYPE.equals(type)) {
              return "J";
          } else if (Double.TYPE.equals(type)) {
              return "D";
          }
  
          throw new IllegalStateException("Type: " + type.getCanonicalName() + " is not a primitive type");
      }
  
      public static Type getMethodType(Class<?> clazz, String methodName) {
          try {
              Method method = clazz.getMethod(methodName);
  
              return method.getGenericReturnType();
          } catch (Exception ex) {
              return null;
          }
      }
  
      public static Type getFieldType(Class<?> clazz, String fieldName) {
          try {
              Field field = clazz.getField(fieldName);
  
              return field.getGenericType();
          } catch (Exception ex) {
              return null;
          }
      }
  }
  