1 32 package net.sf.retrotranslator.transformer; 33 34 import net.sf.retrotranslator.runtime.asm.Type; 35 36 39 class TransformerTools { 40 41 public static final String RUNTIME_PREFIX = "net/sf/retrotranslator/runtime/"; 42 public static final String CONCURRENT_PREFIX = "edu/emory/mathcs/backport/"; 43 44 public static String descriptor(Class returnType, Class ... 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 name) { 53 return Type.getType('L' + name + ';'); 54 } 55 56 public static Type getArrayTypeByInternalName(String name, int dimensions) { 57 StringBuilder builder = new StringBuilder (); 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 |