1 21 package proguard.classfile.util; 22 23 import proguard.classfile.*; 24 import proguard.classfile.visitor.*; 25 26 32 public class MemberFinder 33 extends SimplifiedVisitor 34 implements MemberVisitor 35 { 36 private static class MemberFoundException extends RuntimeException {}; 37 private static final MemberFoundException MEMBER_FOUND = new MemberFoundException(); 38 39 private Clazz clazz; 40 private Member member; 41 42 43 47 public Field findField(Clazz referencingClass, 48 Clazz clazz, 49 String name, 50 String descriptor) 51 { 52 return (Field)findMember(referencingClass, clazz, name, descriptor, true); 53 } 54 55 56 60 public Method findMethod(Clazz referencingClass, 61 Clazz clazz, 62 String name, 63 String descriptor) 64 { 65 return (Method)findMember(referencingClass, clazz, name, descriptor, false); 66 } 67 68 69 73 public Member findMember(Clazz referencingClass, 74 Clazz clazz, 75 String name, 76 String descriptor, 77 boolean isField) 78 { 79 try 83 { 84 this.clazz = null; 85 this.member = null; 86 clazz.hierarchyAccept(true, true, true, false, isField ? 87 (ClassVisitor)new NamedFieldVisitor(name, descriptor, 88 new MemberClassAccessFilter(referencingClass, this)) : 89 (ClassVisitor)new NamedMethodVisitor(name, descriptor, 90 new MemberClassAccessFilter(referencingClass, this))); 91 } 92 catch (MemberFoundException ex) 93 { 94 } 95 96 return member; 97 } 98 99 100 104 public Clazz correspondingClass() 105 { 106 return clazz; 107 } 108 109 110 114 public boolean isOverriden(Clazz clazz, 115 Method method) 116 { 117 String name = method.getName(clazz); 118 String descriptor = method.getDescriptor(clazz); 119 120 try 122 { 123 this.clazz = null; 124 this.member = null; 125 126 clazz.hierarchyAccept(false, false, false, true, 127 new NamedMethodVisitor(name, descriptor, 128 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, this))); 129 } 130 catch (MemberFoundException ex) 131 { 132 return true; 134 } 135 136 return false; 137 } 138 139 140 144 public boolean isShadowed(Clazz clazz, 145 Field field) 146 { 147 String name = field.getName(clazz); 148 String descriptor = field.getDescriptor(clazz); 149 150 try 152 { 153 this.clazz = null; 154 this.member = null; 155 clazz.hierarchyAccept(false, false, false, true, 156 new NamedFieldVisitor(name, descriptor, 157 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, this))); 158 } 159 catch (MemberFoundException ex) 160 { 161 return true; 163 } 164 165 return false; 166 } 167 168 169 186 187 189 public void visitAnyMember(Clazz clazz, Member member) 190 { 191 this.clazz = clazz; 192 this.member = member; 193 194 throw MEMBER_FOUND; 195 } 196 } 197 | Popular Tags |