1 32 package net.sf.retrotranslator.runtime.java.lang; 33 34 import java.lang.reflect.*; 35 import java.util.Arrays ; 36 import net.sf.retrotranslator.runtime.asm.Opcodes; 37 import net.sf.retrotranslator.runtime.impl.*; 38 import net.sf.retrotranslator.runtime.java.lang.annotation.Annotation_; 39 40 43 public class _Class { 44 45 public static Class asSubclass(Class aClass, Class superclass) { 46 if (superclass.isAssignableFrom(aClass)) return aClass; 47 throw new ClassCastException (aClass.toString()); 48 } 49 50 public static Object cast(Class aClass, Object obj) { 51 if (obj == null || aClass.isInstance(obj)) return obj; 52 throw new ClassCastException (aClass.toString()); 53 } 54 55 public static Annotation_ getAnnotation(Class aClass, Class annotationType) { 56 return ClassDescriptor.getInstance(aClass).getAnnotation(annotationType); 57 } 58 59 public static Annotation_[] getAnnotations(final Class aClass) { 60 return ClassDescriptor.getInstance(aClass).getAnnotations(); 61 } 62 63 public static String getCanonicalName(Class aClass) { 64 if (aClass.isArray()) { 65 String name = getCanonicalName(aClass.getComponentType()); 66 return name == null ? null : name + "[]"; 67 } 68 if (ClassDescriptor.getInstance(aClass).isLocalOrAnonymous()) return null; 69 Class declaringClass = aClass.getDeclaringClass(); 70 return declaringClass == null ? aClass.getName() 71 : getCanonicalName(declaringClass) + "." + getSimpleName(aClass); 72 } 73 74 public static Annotation_[] getDeclaredAnnotations(Class aClass) { 75 return ClassDescriptor.getInstance(aClass).getDeclaredAnnotations(); 76 } 77 78 @Advanced 79 public static Method getDeclaredMethod(Class aClass, String name, Class ... parameterTypes) 80 throws NoSuchMethodException , SecurityException { 81 Method method = findMethod(aClass.getDeclaredMethods(), name, parameterTypes); 82 return method != null ? method : aClass.getDeclaredMethod(name, parameterTypes); 83 } 84 85 public static Class getEnclosingClass(Class aClass) { 86 MethodDescriptor descriptor = ClassDescriptor.getInstance(aClass).getEnclosingMethodDescriptor(); 87 return descriptor == null ? aClass.getDeclaringClass() : descriptor.getClassDescriptor().getTarget(); 88 } 89 90 public static Constructor getEnclosingConstructor(Class aClass) { 91 MethodDescriptor descriptor = ClassDescriptor.getInstance(aClass).getEnclosingMethodDescriptor(); 92 return descriptor == null ? null : descriptor.getConstructor(); 93 } 94 95 public static Method getEnclosingMethod(Class aClass) { 96 MethodDescriptor descriptor = ClassDescriptor.getInstance(aClass).getEnclosingMethodDescriptor(); 97 return descriptor == null ? null : descriptor.getMethod(); 98 } 99 100 public static Object [] getEnumConstants(Class aClass) { 101 Object [] constants = Enum_.getEnumConstants(aClass); 102 return constants == null ? null : constants.clone(); 103 } 104 105 public static Type[] getGenericInterfaces(Class aClass) { 106 Type[] interfaces = ClassDescriptor.getInstance(aClass).getGenericInterfaces(); 107 return interfaces != null ? interfaces : aClass.getInterfaces(); 108 } 109 110 public static Type getGenericSuperclass(Class aClass) { 111 Type genericSuperclass = ClassDescriptor.getInstance(aClass).getGenericSuperclass(); 112 return genericSuperclass != null ? genericSuperclass : aClass.getSuperclass(); 113 } 114 115 @Advanced 116 public static Method getMethod(Class aClass, String name, Class ... parameterTypes) 117 throws NoSuchMethodException , SecurityException { 118 Method method = findMethod(aClass.getMethods(), name, parameterTypes); 119 return method != null ? method : aClass.getMethod(name, parameterTypes); 120 } 121 122 public static String getSimpleName(Class aClass) { 123 if (aClass.isArray()) return getSimpleName(aClass.getComponentType()) + "[]"; 124 String thisName = aClass.getName(); 125 Class enclosingClass = getEnclosingClass(aClass); 126 if (enclosingClass == null) return thisName.substring(thisName.lastIndexOf('.') + 1); 127 String enclosingName = enclosingClass.getName(); 128 if (!thisName.startsWith(enclosingName)) throw new InternalError (); 129 String name = thisName.substring(enclosingName.length()); 130 if (!name.startsWith("$")) throw new InternalError (); 131 for (int i = 1; i < name.length(); i++) { 132 char c = name.charAt(i); 133 if (c < '0' || c > '9') return name.substring(i); 134 } 135 return ""; 136 } 137 138 public static TypeVariable[] getTypeParameters(Class aClass) { 139 return ClassDescriptor.getInstance(aClass).getTypeParameters(); 140 } 141 142 public static boolean isAnnotation(Class aClass) { 143 return ClassDescriptor.getInstance(aClass).isAccess(Opcodes.ACC_ANNOTATION); 144 } 145 146 public static boolean isAnnotationPresent(Class aClass, Class annotationType) { 147 return ClassDescriptor.getInstance(aClass).isAnnotationPresent(annotationType); 148 } 149 150 public static boolean isAnonymousClass(Class aClass) { 151 return "".equals(getSimpleName(aClass)); 152 } 153 154 public static boolean isEnum(Class aClass) { 155 return aClass.getSuperclass() == Enum .class && ClassDescriptor.getInstance(aClass).isAccess(Opcodes.ACC_ENUM); 156 } 157 158 public static boolean isLocalClass(Class aClass) { 159 return ClassDescriptor.getInstance(aClass).isLocalOrAnonymous() && !isAnonymousClass(aClass); 160 } 161 162 public static boolean isMemberClass(Class aClass) { 163 return aClass.getDeclaringClass() != null; 164 } 165 166 public static boolean isSynthetic(Class aClass) { 167 return ClassDescriptor.getInstance(aClass).isAccess(Opcodes.ACC_SYNTHETIC); 168 } 169 170 private static Method findMethod(Method[] methods, String name, Class ... parameterTypes) { 171 Method result = null; 172 for (Method method : methods) { 173 if (method.getName().equals(name) && Arrays.equals(method.getParameterTypes(), parameterTypes) && 174 (result == null || result.getReturnType().isAssignableFrom(method.getReturnType()))) { 175 result = method; 176 } 177 } 178 return result; 179 } 180 } 181 | Popular Tags |