< prev index next >

src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java

Print this page




  73         return ptypes;
  74     }
  75 
  76     private static void parseError(String str, String msg) {
  77         throw new IllegalArgumentException("bad signature: "+str+": "+msg);
  78     }
  79 
  80     /**
  81      * @param loader the class loader in which to look up the types (null means
  82      *               bootstrap class loader)
  83      */
  84     private static Class<?> parseSig(String str, int[] i, int end, ClassLoader loader) {
  85         if (i[0] == end)  return null;
  86         char c = str.charAt(i[0]++);
  87         if (c == 'L' || c == 'Q') {
  88             int begc = i[0], endc = str.indexOf(';', begc);
  89             if (endc < 0)  return null;
  90             i[0] = endc+1;
  91             String name = str.substring(begc, endc).replace('/', '.');
  92             try {
  93                 return (loader == null)
  94                     ? Class.forName(name, false, null)
  95                     : loader.loadClass(name);

  96             } catch (ClassNotFoundException ex) {
  97                 throw new TypeNotPresentException(name, ex);
  98             }
  99         } else if (c == '[') {
 100             Class<?> t = parseSig(str, i, end, loader);
 101             if (t != null)
 102                 t = java.lang.reflect.Array.newInstance(t, 0).getClass();
 103             return t;
 104         } else {
 105             return Wrapper.forBasicType(c).primitiveType();
 106         }
 107     }
 108 
 109     public static String unparse(Class<?> type) {
 110         if (type == Object.class) {
 111             return "Ljava/lang/Object;";
 112         } else if (type == int.class) {
 113             return "I";
 114         }
 115         StringBuilder sb = new StringBuilder();


 134         sb.append('(');
 135         for (Class<?> pt : ptypes)
 136             unparseSig(pt, sb);
 137         sb.append(')');
 138         unparseSig(rtype, sb);
 139         return sb.toString();
 140     }
 141 
 142     public static String unparseMethod(Class<?> rtype, Class<?>[] ptypes) {
 143         StringBuilder sb = new StringBuilder();
 144         sb.append('(');
 145         for (Class<?> pt : ptypes)
 146             unparseSig(pt, sb);
 147         sb.append(')');
 148         unparseSig(rtype, sb);
 149         return sb.toString();
 150     }
 151 
 152     private static void unparseSig(Class<?> t, StringBuilder sb) {
 153         char c = Wrapper.forBasicType(t).basicTypeChar();
 154         if (c != 'L' && c != 'Q') {
 155             sb.append(c);
 156         } else if (t == Object.class) {
 157             sb.append("Ljava/lang/Object;");
 158         } else {
 159             boolean lsemi = (!t.isArray());


 160             if (lsemi)  sb.append(c);
 161             sb.append(t.getName().replace('.', '/'));
 162             if (lsemi)  sb.append(';');
 163         }
 164     }
 165 
 166 }


  73         return ptypes;
  74     }
  75 
  76     private static void parseError(String str, String msg) {
  77         throw new IllegalArgumentException("bad signature: "+str+": "+msg);
  78     }
  79 
  80     /**
  81      * @param loader the class loader in which to look up the types (null means
  82      *               bootstrap class loader)
  83      */
  84     private static Class<?> parseSig(String str, int[] i, int end, ClassLoader loader) {
  85         if (i[0] == end)  return null;
  86         char c = str.charAt(i[0]++);
  87         if (c == 'L' || c == 'Q') {
  88             int begc = i[0], endc = str.indexOf(';', begc);
  89             if (endc < 0)  return null;
  90             i[0] = endc+1;
  91             String name = str.substring(begc, endc).replace('/', '.');
  92             try {
  93                 Class<?> clz = (loader == null)
  94                                     ? Class.forName(name, false, null)
  95                                     : loader.loadClass(name);
  96                 return c == 'Q' ? clz.asValueType() : clz.asBoxType();
  97             } catch (ClassNotFoundException ex) {
  98                 throw new TypeNotPresentException(name, ex);
  99             }
 100         } else if (c == '[') {
 101             Class<?> t = parseSig(str, i, end, loader);
 102             if (t != null)
 103                 t = java.lang.reflect.Array.newInstance(t, 0).getClass();
 104             return t;
 105         } else {
 106             return Wrapper.forBasicType(c).primitiveType();
 107         }
 108     }
 109 
 110     public static String unparse(Class<?> type) {
 111         if (type == Object.class) {
 112             return "Ljava/lang/Object;";
 113         } else if (type == int.class) {
 114             return "I";
 115         }
 116         StringBuilder sb = new StringBuilder();


 135         sb.append('(');
 136         for (Class<?> pt : ptypes)
 137             unparseSig(pt, sb);
 138         sb.append(')');
 139         unparseSig(rtype, sb);
 140         return sb.toString();
 141     }
 142 
 143     public static String unparseMethod(Class<?> rtype, Class<?>[] ptypes) {
 144         StringBuilder sb = new StringBuilder();
 145         sb.append('(');
 146         for (Class<?> pt : ptypes)
 147             unparseSig(pt, sb);
 148         sb.append(')');
 149         unparseSig(rtype, sb);
 150         return sb.toString();
 151     }
 152 
 153     private static void unparseSig(Class<?> t, StringBuilder sb) {
 154         char c = Wrapper.forBasicType(t).basicTypeChar();
 155         if (c != 'L') {
 156             sb.append(c);
 157         } else if (t == Object.class) {
 158             sb.append("Ljava/lang/Object;");
 159         } else {
 160             boolean lsemi = (!t.isArray());
 161             if (t == t.asValueType())
 162                 c = 'Q';
 163             if (lsemi)  sb.append(c);
 164             sb.append(t.getName().replace('.', '/'));
 165             if (lsemi)  sb.append(';');
 166         }
 167     }
 168 
 169 }
< prev index next >