KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > retrotranslator > transformer > TransformerTools


1 /***
2  * Retrotranslator: a Java bytecode transformer that translates Java classes
3  * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
4  *
5  * Copyright (c) 2005 - 2007 Taras Puchko
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holders nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package net.sf.retrotranslator.transformer;
33
34 import net.sf.retrotranslator.runtime.asm.Type;
35
36 /**
37  * @author Taras Puchko
38  */

39 class TransformerTools {
40
41     public static final String JavaDoc RUNTIME_PREFIX = "net/sf/retrotranslator/runtime/";
42     public static final String JavaDoc CONCURRENT_PREFIX = "edu/emory/mathcs/backport/";
43
44     public static String JavaDoc descriptor(Class JavaDoc returnType, Class JavaDoc... parameterTypes) {
45         Type[] argumentTypes = new Type[parameterTypes.length];
46         for (int i = 0; i < argumentTypes.length; i++) {
47             argumentTypes[i] = Type.getType(parameterTypes[i]);
48         }
49         return Type.getMethodDescriptor(Type.getType(returnType), argumentTypes);
50     }
51
52     public static Type getTypeByInternalName(String JavaDoc name) {
53         return Type.getType('L' + name + ';');
54     }
55
56     public static Type getArrayTypeByInternalName(String JavaDoc name, int dimensions) {
57         StringBuilder JavaDoc builder = new StringBuilder JavaDoc();
58         for (int i = 0; i < dimensions; i++) {
59             builder.append('[');
60         }
61         return Type.getType(builder.append('L').append(name).append(';').toString());
62     }
63
64     public static boolean isClassFile(byte[] bytes) {
65         return bytes.length >= 4 &&
66                 bytes[0] == ((byte) 0xCA) &&
67                 bytes[1] == ((byte) 0xFE) &&
68                 bytes[2] == ((byte) 0xBA) &&
69                 bytes[3] == ((byte) 0xBE);
70     }
71
72     public static int getClassVersion(byte[] bytes, int offset) {
73         return get(bytes, offset, 4, 24) | get(bytes, offset, 5, 16) |
74                 get(bytes, offset, 6, 8) | get(bytes, offset, 7, 0);
75     }
76
77     private static int get(byte[] bytes, int offset, int index, int shift) {
78         return (bytes[offset + index] & 0xFF) << shift;
79     }
80
81 }
82
Popular Tags