public SootMethod resolveSpecialDispatch(SpecialInvokeExpr ie, SootMethod container) {
    container.getDeclaringClass().checkLevel(SootClass.HIERARCHY);
    SootMethod target = ie.getMethod();
    target.getDeclaringClass().checkLevel(SootClass.HIERARCHY);
    /*
     * This is a bizarre condition! Hopefully the implementation is correct. See VM Spec, 2nd Edition, Chapter 6, in the
     * definition of invokespecial.
     */
    if ("<init>".equals(target.getName()) || target.isPrivate()) {
      return target;
    } else if (isClassSubclassOf(target.getDeclaringClass(), container.getDeclaringClass())) {
      return resolveConcreteDispatch(container.getDeclaringClass(), target);
    } else {
      return target;
    }
  }
public SootMethod resolveSpecialDispatch(SpecialInvokeExpr ie, SootMethod container) {
    container.getDeclaringClass().checkLevel(SootClass.HIERARCHY);
    SootMethod target = ie.getMethod();
    target.getDeclaringClass().checkLevel(SootClass.HIERARCHY);
   
    if ("<init>".equals(target.getName()) || target.isPrivate()) {
      return target;
    } else if (isClassSubclassOf(target.getDeclaringClass(), container.getDeclaringClass())) {
      return resolveConcreteDispatch(container.getDeclaringClass(), target);
    } else {
      return target;
    }
  }
public sootmethod resolvespecialdispatch(specialinvokeexpr ie, sootmethod container) { container.getdeclaringclass().checklevel(sootclass.hierarchy); sootmethod target = ie.getmethod(); target.getdeclaringclass().checklevel(sootclass.hierarchy); if ("<init>".equals(target.getname()) || target.isprivate()) { return target; } else if (isclasssubclassof(target.getdeclaringclass(), container.getdeclaringclass())) { return resolveconcretedispatch(container.getdeclaringclass(), target); } else { return target; } }