1 28 29 package org.jibx.binding.classes; 30 31 import org.apache.bcel.Constants; 32 import org.apache.bcel.classfile.ExceptionTable; 33 import org.apache.bcel.classfile.Method; 34 35 45 46 public abstract class BindingMethod 47 { 48 49 private ClassFile m_classFile; 50 51 56 57 protected BindingMethod(ClassFile cf) { 58 m_classFile = cf; 59 } 60 61 66 67 public ClassFile getClassFile() { 68 return m_classFile; 69 } 70 71 77 78 public abstract String getName(); 79 80 86 87 public abstract String getSignature(); 88 89 95 96 public abstract int getAccessFlags(); 97 98 104 105 public abstract void setAccessFlags(int flags); 106 107 112 113 public abstract Method getMethod(); 114 115 120 121 public abstract ClassItem getItem(); 122 123 130 131 public void makeAccessible(ClassFile src) { 132 133 int access = getAccessFlags(); 135 if ((access & Constants.ACC_PUBLIC) == 0) { 136 137 ClassFile dest = getClassFile(); 139 if (dest.getPackage().equals(src.getPackage())) { 140 if ((access & Constants.ACC_PRIVATE) != 0) { 141 access = access - Constants.ACC_PRIVATE; 142 } 143 } else { 144 145 ClassFile ancestor = src; 147 while ((ancestor = ancestor.getSuperFile()) != null) { 148 if (ancestor == dest) { 149 break; 150 } 151 } 152 153 if (ancestor == null) { 155 int clear = Constants.ACC_PRIVATE | 156 Constants.ACC_PROTECTED; 157 access = (access & ~clear) | Constants.ACC_PUBLIC; 158 } else if ((access & Constants.ACC_PROTECTED) == 0) { 159 access = (access & ~Constants.ACC_PRIVATE) | 160 Constants.ACC_PROTECTED; 161 } 162 } 163 164 if (access != getAccessFlags()) { 166 setAccessFlags(access); 167 } 168 } 169 } 170 171 178 179 public static int computeMethodHash(Method method) { 180 int hash = method.getSignature().hashCode(); 181 ExceptionTable etab = method.getExceptionTable(); 182 if (etab != null) { 183 String [] excepts = etab.getExceptionNames(); 184 for (int i = 0; i < excepts.length; i++) { 185 hash += excepts[i].hashCode(); 186 } 187 } 188 byte[] code = method.getCode().getCode(); 189 for (int i = 0; i < code.length; i++) { 190 hash = hash * 49 + code[i]; 191 } 192 return hash; 193 } 194 195 202 203 public abstract int hashCode(); 204 205 211 212 public boolean equals(Object obj) { 213 if (obj instanceof BindingMethod) { 214 BindingMethod comp = (BindingMethod)obj; 215 if (hashCode() == comp.hashCode() && 216 getSignature().equals(comp.getSignature())) { 217 return ClassFile.equalMethods 218 (this.getMethod(), comp.getMethod()); 219 } 220 } 221 return false; 222 } 223 } 224 | Popular Tags |