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();
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 }
|
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.asPrimaryType() : clz.asNullableType();
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();
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.isNullableType())
162 c = 'Q';
163 String n = t.isInlineClass() ? t.asPrimaryType().getName() : t.getName();
164 if (lsemi) sb.append(c);
165 sb.append(n.replace('.', '/'));
166 if (lsemi) sb.append(';');
167 }
168 }
169
170 }
|