71 } 72 73 public Method getOverriddenMethod(Class staticTarget, Class dynamicTarget) { 74 // Assertion #1. C is a subclass of A 75 if (!staticTarget.isAssignableFrom(dynamicTarget)) { 76 return null; 77 } 78 79 Method staticTargetMethod = getDeclaredMethod(staticTarget); 80 Method dynamicTargetMethod = getDeclaredMethod(dynamicTarget); 81 82 if (staticTarget.equals(dynamicTarget)) { 83 return staticTargetMethod; 84 } 85 86 // TODO: ? need to find out the right behavior 87 if (staticTargetMethod == null) { 88 return null; 89 } 90 91 // Dynamic target doesn't have desired method, so check it's superclass 92 if (dynamicTargetMethod == null) { 93 return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass()); 94 } else { 95 // Private method can't override anything 96 if (Modifier.isPrivate(dynamicTargetMethod.getModifiers())) { 97 return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass()); 98 } 99 } 100 101 // TODO: abstract methods 102 103 //Assertion #3.a: A.m2 is PUB || PROT || (PP && PKG(A) == PKG(C)) 104 int staticTargetModifiers = staticTargetMethod.getModifiers(); 105 { 106 boolean isPublic = Modifier.isPublic(staticTargetModifiers); 107 boolean isProtected = Modifier.isProtected(staticTargetModifiers); 108 boolean isPrivate = Modifier.isPrivate(staticTargetModifiers) ; 109 String staticTargetPkg = getClassPackageName(staticTarget); 110 String dynamicTargetPkg = getClassPackageName(dynamicTarget); 111 112 if ( isPublic || isProtected 113 || ( !isPublic && !isProtected && !isPrivate 114 && staticTargetPkg.equals(dynamicTargetPkg) 115 )) 116 { 117 return dynamicTargetMethod; 118 } 119 } 120 // OR 121 //Assertion #3.b: exists m3: C.m1 != B.m3, A.m2 != B.m3, B.m3 overrides A.m2, C.m1 overrides B.m3 122 Class ancestor = dynamicTarget.getSuperclass(); 123 while (ancestor != staticTarget) { 124 Method OverriddenM2 = getOverriddenMethod(staticTarget, ancestor); 125 Method m3 = getDeclaredMethod(ancestor); 126 Method m1 = getOverriddenMethod(ancestor, dynamicTarget); 127 128 if (m1 != null && m3 != null) { 129 if (m1.equals(dynamicTargetMethod) && m3.equals(OverriddenM2)) { 130 return dynamicTargetMethod; 131 } 132 } else { 133 if (m1 == null && dynamicTargetMethod == null 134 && m3 == null && OverriddenM2 == null) 135 { 136 return null; | 71 } 72 73 public Method getOverriddenMethod(Class staticTarget, Class dynamicTarget) { 74 // Assertion #1. C is a subclass of A 75 if (!staticTarget.isAssignableFrom(dynamicTarget)) { 76 return null; 77 } 78 79 Method staticTargetMethod = getDeclaredMethod(staticTarget); 80 Method dynamicTargetMethod = getDeclaredMethod(dynamicTarget); 81 82 if (staticTarget.equals(dynamicTarget)) { 83 return staticTargetMethod; 84 } 85 86 // TODO: ? need to find out the right behavior 87 if (staticTargetMethod == null) { 88 return null; 89 } 90 91 // Dynamic target doesn't have desired method, so check its superclass 92 if (dynamicTargetMethod == null) { 93 return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass()); 94 } else { 95 // Private method can't override anything 96 if (Modifier.isPrivate(dynamicTargetMethod.getModifiers())) { 97 return getOverriddenMethod(staticTarget, dynamicTarget.getSuperclass()); 98 } 99 } 100 101 // TODO: abstract methods 102 103 //Assertion #3.a: A.m2 is PUB || PROT || (PP && PKG(A) == PKG(C)) 104 int staticTargetModifiers = staticTargetMethod.getModifiers(); 105 { 106 boolean isPublic = Modifier.isPublic(staticTargetModifiers); 107 boolean isProtected = Modifier.isProtected(staticTargetModifiers); 108 boolean isPrivate = Modifier.isPrivate(staticTargetModifiers) ; 109 String staticTargetPkg = getClassPackageName(staticTarget); 110 String dynamicTargetPkg = getClassPackageName(dynamicTarget); 111 112 if (isPublic || isProtected 113 || (!isPublic && !isProtected && !isPrivate 114 && staticTargetPkg.equals(dynamicTargetPkg))) { 115 return dynamicTargetMethod; 116 } 117 } 118 // OR 119 //Assertion #3.b: exists m3: C.m1 != B.m3, A.m2 != B.m3, B.m3 overrides A.m2, C.m1 overrides B.m3 120 Class ancestor = dynamicTarget.getSuperclass(); 121 while (ancestor != staticTarget) { 122 Method OverriddenM2 = getOverriddenMethod(staticTarget, ancestor); 123 Method m3 = getDeclaredMethod(ancestor); 124 Method m1 = getOverriddenMethod(ancestor, dynamicTarget); 125 126 if (m1 != null && m3 != null) { 127 if (m1.equals(dynamicTargetMethod) && m3.equals(OverriddenM2)) { 128 return dynamicTargetMethod; 129 } 130 } else { 131 if (m1 == null && dynamicTargetMethod == null 132 && m3 == null && OverriddenM2 == null) 133 { 134 return null; |