+
+ /** Returns the type name of a class as per VM Spec 4.3.2. */
+ private static char[] typeName(Class p) {
+ StringBuffer sb = new StringBuffer();
+ typeName(p, sb);
+ return sb.toString().toCharArray();
+ }
+
+ /** Returns the type name of a class as per VM Spec 4.3.2.
+ * eg. int -> I, String -> Ljava/lang/String; */
+ private static void typeName(Class p, StringBuffer sb) {
+ String name = p.getName();
+ switch (name.charAt(0)) {
+ case 'B': case 'C': case 'D': case 'F': case 'I':
+ case 'J': case 'S': case 'Z': case 'V': case '[':
+ sb.append(name); break;
+
+ case 'b': if (name.equals("boolean")) { sb.append('Z'); break; }
+ if (name.equals("byte")) { sb.append('B'); break; }
+ case 'c': if (name.equals("char")) { sb.append('C'); break; }
+ case 'd': if (name.equals("double")) { sb.append('D'); break; }
+ case 'f': if (name.equals("float")) { sb.append('F'); break; }
+ case 'i': if (name.equals("int")) { sb.append('I'); break; }
+ case 'l': if (name.equals("long")) { sb.append('J'); break; }
+ case 's': if (name.equals("short")) { sb.append('S'); break; }
+ case 'v': if (name.equals("void")) { sb.append('V'); break; }
+ default:
+ sb.append('L'); sb.append(name(p)); sb.append(';');
+ }
+ }
+
+ /** Returns the descriptor of a method per VM Spec 4.3.3.
+ * eg. int get(String n, boolean b) -> (Ljava/lang/String;B)I */
+ private static char[] descriptor(Class[] p, Class r) {
+ StringBuffer sb = new StringBuffer();
+ sb.append('(');
+ if (p != null) for (int i=0; i < p.length; i++) typeName(p[i], sb);
+ sb.append(')');
+ if (r != null) typeName(r, sb);
+ return sb.toString().toCharArray();
+ }
+