KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > sli > kim > classfile > Signature


1 package sli.kim.classfile;
2
3 /**
4 * This class provides a useful routine to convert signatures to
5 * regular java type declarations.
6 */

7 public class Signature {
8     // Signature is not meant to be instantiated
9
private Signature() {}
10
11     /**
12     * Convert a signature into a normal type declaration.
13     * <ul>
14     * <li>"I",null -&gt; "int"
15     * <li>"Z","foo" -&gt; "boolean foo"
16     * <li>"[J","foo" -&gt; "long[] foo"
17     * <li>"Lmypackage/MyClass;",null -&gt; "mypackage.MyClass"
18     * <li>"()V",null -&gt; "void ()"
19     * <li>"(S[Ljava/lang/String;)V","foo" -&gt; "void foo (short, String[])"
20     * </ul>
21     * @param sig the signature.
22     * @param name the name of the field or method. This can be null.
23     */

24     public static String JavaDoc signatureToTypeDecl(String JavaDoc sig, String JavaDoc name) {
25         String JavaDoc[] sigOut = new String JavaDoc[1];
26         sigOut[0] = sig;
27         return _sigToType(sigOut, name);
28     }
29
30     private static String JavaDoc _sigToType(String JavaDoc[] sigOut, String JavaDoc name) {
31         if (sigOut[0] == null || sigOut[0].length() == 0)
32             return "";
33
34         String JavaDoc sig = sigOut[0];
35         String JavaDoc result = "";
36         
37         switch (sig.charAt(0)) {
38         case 'V':
39             result = "void";
40             sig = sig.substring(1);
41             break;
42         case 'B':
43             result = "byte";
44             sig = sig.substring(1);
45             break;
46         case 'S':
47             result = "short";
48             sig = sig.substring(1);
49             break;
50         case 'I':
51             result = "int";
52             sig = sig.substring(1);
53             break;
54         case 'J':
55             result = "long";
56             sig = sig.substring(1);
57             break;
58         case 'F':
59             result = "float";
60             sig = sig.substring(1);
61             break;
62         case 'D':
63             result = "double";
64             sig = sig.substring(1);
65             break;
66         case 'Z':
67             result = "boolean";
68             sig = sig.substring(1);
69             break;
70         case 'L':
71             {
72                 int semi = sig.indexOf(';');
73                 result = sig.substring(1, semi).replace('/', '.');
74                 if (result.startsWith("java.lang."))
75                     result = result.substring(10);
76                 sig = sig.substring(semi+1);
77             }
78             break;
79         case '[':
80             {
81                 sig = sig.substring(1);
82                 sigOut[0] = sig;
83                 result = _sigToType(sigOut, null) + "[]";
84                 sig = sigOut[0];
85             }
86             break;
87         case '(':
88             {
89                 int closeParen = sig.indexOf(')');
90                 String JavaDoc[] paramOut = new String JavaDoc[1];
91                 paramOut[0] = sig.substring(1, closeParen);
92                 String JavaDoc paramStr = "";
93                 while (paramOut[0] != null && paramOut[0].length() > 0) {
94                     paramStr += _sigToType(paramOut, null);
95                     if (paramOut[0] != null && paramOut[0].length() > 0)
96                         paramStr += ", ";
97                 }
98                 String JavaDoc[] returnOut = new String JavaDoc[1];
99                 returnOut[0] = sig.substring(closeParen+1);
100                 String JavaDoc returnStr = _sigToType(returnOut, name);
101                 result = returnStr + " (" + paramStr + ')';
102                 name = null;
103             }
104             break;
105         }
106
107         sigOut[0] = sig;
108         return result + (name != null ? " " + name : "");
109     }
110
111     /**
112     * Simple unit test. Usage:
113     * <pre>java sli.kim.classfile.Signature &lt;signature&gt; [&lt;name&gt;]</pre>
114     */

115     public static void main(String JavaDoc[] args) {
116         if (args.length == 2)
117             System.out.println(signatureToTypeDecl(args[0], args[1]));
118         else
119             System.out.println(signatureToTypeDecl(args[0], null));
120     }
121 }
122 
Popular Tags