1 16 package com.google.gwt.dev.shell; 17 18 import java.lang.reflect.Field ; 19 import java.lang.reflect.Member ; 20 import java.lang.reflect.Method ; 21 import java.util.ArrayList ; 22 import java.util.HashMap ; 23 24 28 public class DispatchClassInfo { 29 30 private Class cls; 31 32 private final int clsId; 33 34 private ArrayList memberById; 35 36 private HashMap memberIdByName; 37 38 public DispatchClassInfo(Class cls, int classId) { 39 this.cls = cls; 40 clsId = classId; 41 } 42 43 public int getClassId() { 44 return clsId; 45 } 46 47 public Member getMember(int id) { 48 lazyInitTargetMembers(); 49 id &= 0xffff; 50 return (Member ) memberById.get(id); 51 } 52 53 public int getMemberId(String mangledMemberName) { 54 lazyInitTargetMembers(); 55 56 Integer id = (Integer ) memberIdByName.get(mangledMemberName); 57 if (id == null) { 58 return -1; 59 } 60 61 return id.intValue(); 62 } 63 64 private void addMember(Member member, String sig) { 65 memberById.add(member); 66 int index = memberById.size() - 1; 67 memberIdByName.put(sig, new Integer (index)); 68 } 69 70 74 private String getJsniSignature(Method method) { 75 String name = method.getName(); 76 77 StringBuffer sb = new StringBuffer (); 78 sb.append(name); 79 sb.append("("); 80 Class [] paramTypes = method.getParameterTypes(); 81 for (int i = 0; i < paramTypes.length; ++i) { 82 Class type = paramTypes[i]; 83 String typeSig = getTypeSig(type); 84 sb.append(typeSig); 85 } 86 sb.append(")"); 87 88 String mangledName = sb.toString(); 89 return mangledName; 90 } 91 92 private String getTypeSig(Class type) { 93 if (type.isArray()) { 94 return "[" + getTypeSig(type.getComponentType()); 95 } 96 97 if (type.isPrimitive()) { 98 if (type.equals(int.class)) { 99 return "I"; 100 } else if (type.equals(boolean.class)) { 101 return "Z"; 102 } else if (type.equals(char.class)) { 103 return "C"; 104 } else if (type.equals(long.class)) { 105 return "J"; 106 } else if (type.equals(short.class)) { 107 return "S"; 108 } else if (type.equals(float.class)) { 109 return "F"; 110 } else if (type.equals(double.class)) { 111 return "D"; 112 } else if (type.equals(byte.class)) { 113 return "B"; 114 } else { 115 throw new RuntimeException ("Unexpected primitive type: " 116 + type.getName()); 117 } 118 } else { 119 StringBuffer sb = new StringBuffer (); 120 sb.append("L"); 121 sb.append(type.getName().replace('.', '/')); 122 sb.append(";"); 123 return sb.toString(); 124 } 125 } 126 127 private void lazyInitTargetMembers() { 128 if (memberById == null) { 129 memberById = new ArrayList (); 130 memberById.add(null); memberIdByName = new HashMap (); 132 lazyInitTargetMembersUsingReflectionHelper(cls); 133 } 134 } 135 136 private void lazyInitTargetMembersUsingReflectionHelper(Class targetClass) { 137 Class superclass = targetClass.getSuperclass(); 139 if (superclass != null) { 140 lazyInitTargetMembersUsingReflectionHelper(superclass); 141 } 142 143 155 156 Method [] methods = targetClass.getDeclaredMethods(); 159 for (int i = 0; i < methods.length; i++) { 160 methods[i].setAccessible(true); 161 String sig = getJsniSignature(methods[i]); 162 addMember(methods[i], sig); 163 } 164 165 Field [] fields = targetClass.getDeclaredFields(); 167 for (int i = 0; i < fields.length; i++) { 168 fields[i].setAccessible(true); 169 addMember(fields[i], fields[i].getName()); 170 } 171 } 172 } 173 | Popular Tags |