-
Notifications
You must be signed in to change notification settings - Fork 298
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
More easily detect overridden methods & calls to super #1040
base: main
Are you sure you want to change the base?
Changes from 1 commit
380958a
e569b0e
9c68442
9f58651
1903590
3e97e3f
3ea2f36
c901839
9e74551
c9e63f6
02eae70
e67cb29
d7c3481
2acc5d6
9c8a0a2
82c8bfa
1767d88
b8b74e6
c13a74a
fa2bebc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,20 +15,21 @@ | |
*/ | ||
package com.tngtech.archunit.core.domain; | ||
|
||
import java.lang.reflect.Method; | ||
import java.util.List; | ||
import java.util.Optional; | ||
import java.util.Set; | ||
import java.util.function.Function; | ||
import java.util.function.Supplier; | ||
|
||
import com.tngtech.archunit.PublicAPI; | ||
import com.tngtech.archunit.base.ArchUnitException.InconsistentClassPathException; | ||
import com.tngtech.archunit.base.MayResolveTypesViaReflection; | ||
import com.tngtech.archunit.base.ResolvesTypesViaReflection; | ||
import com.tngtech.archunit.base.Suppliers; | ||
import com.tngtech.archunit.core.importer.DomainBuilders; | ||
|
||
import java.lang.reflect.Method; | ||
import java.util.Arrays; | ||
import java.util.List; | ||
import java.util.Optional; | ||
import java.util.Set; | ||
import java.util.function.Function; | ||
import java.util.function.Supplier; | ||
|
||
import static com.google.common.collect.Sets.union; | ||
import static com.tngtech.archunit.PublicAPI.Usage.ACCESS; | ||
import static com.tngtech.archunit.core.domain.Formatters.formatMethod; | ||
|
@@ -125,6 +126,12 @@ public String getDescription() { | |
return "Method <" + getFullName() + ">"; | ||
} | ||
|
||
@PublicAPI(usage = ACCESS) | ||
public boolean isOverridden() { | ||
Method method = methodSupplier.get(); | ||
return Arrays.asList(method.getDeclaringClass().getSuperclass().getDeclaredMethods()).contains(method); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be nice to avoid the (expensive) reflection API, but more importantly: Does this even work for you? Please provide a unit test that proves the correctnes of your code. I'd start with something like this: public class JavaMethodTest {
@Test
public void isOverridden() {
class Base {
void method1() {}
void method1(int x) {}
}
class Child extends Base {
void method1() {}
void method2() {}
}
JavaClass childClass = new ClassFileImporter().importClass(Child.class);
assertThat(childClass.getMethod("method1").isOverridden()).isTrue();
assertThat(childClass.getMethod("method1", int.class).isOverridden()).isFalse();
assertThat(childClass.getMethod("method2").isOverridden()).isFalse();
} Your implementation however gives me |
||
} | ||
|
||
@ResolvesTypesViaReflection | ||
@MayResolveTypesViaReflection(reason = "Just part of a bigger resolution process") | ||
private class ReflectMethodSupplier implements Supplier<Method> { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we please adhere to the import order specified in
CONTRIBUTING.md
, i.e. keep thejava.*
imports at the top?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool, I'll do so in
JavaMethodTest
as well