Add matcher for only concrete classes

This commit is contained in:
Laplie Anderson 2020-02-19 15:56:57 -05:00
parent d45ead1284
commit 147b4a64f1
1 changed files with 39 additions and 43 deletions

View File

@ -24,7 +24,7 @@ public class ByteBuddyElementMatchers {
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeExtendsClass( public static <T extends TypeDescription> ElementMatcher.Junction<T> safeExtendsClass(
final ElementMatcher<? super TypeDescription> matcher) { final ElementMatcher<? super TypeDescription> matcher) {
return safeHasSuperType(matcher); return new SafeExtendsClassMatcher<>(new SafeErasureMatcher<>(matcher));
} }
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasInterface( public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasInterface(
@ -44,22 +44,7 @@ public class ByteBuddyElementMatchers {
*/ */
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasSuperType( public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasSuperType(
final ElementMatcher<? super TypeDescription> matcher) { final ElementMatcher<? super TypeDescription> matcher) {
return safeHasGenericSuperType(new SafeErasureMatcher(matcher)); return new SafeHasSuperTypeMatcher<>(new SafeErasureMatcher<>(matcher));
}
/**
* Matches any type description that declares a super type that matches the provided matcher.
* Exceptions during matching process are logged and ignored.
*
* @param matcher The type to be checked for being a super type of the matched type.
* @param <T> The type of the matched object.
* @return A matcher that matches any type description that declares a super type that matches the
* provided matcher.
* @see ElementMatchers#hasGenericSuperType(net.bytebuddy.matcher.ElementMatcher)
*/
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasGenericSuperType(
final ElementMatcher<? super TypeDescription.Generic> matcher) {
return new SafeHasSuperTypeMatcher<>(matcher);
} }
/** /**
@ -139,19 +124,6 @@ public class ByteBuddyElementMatchers {
return false; return false;
} }
private TypeDefinition safeGetSuperClass(final TypeDefinition typeDefinition) {
try {
return typeDefinition.getSuperClass();
} catch (final Exception e) {
log.debug(
"{} trying to get super class for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
/** /**
* Matches a type's interfaces against the provided matcher. * Matches a type's interfaces against the provided matcher.
* *
@ -371,22 +343,46 @@ public class ByteBuddyElementMatchers {
return false; return false;
} }
private TypeDefinition safeGetSuperClass(final TypeDefinition typeDefinition) {
try {
return typeDefinition.getSuperClass();
} catch (final Exception e) {
log.debug(
"{} trying to get super class for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
@Override @Override
public String toString() { public String toString() {
return "hasSuperMethodMatcher(" + matcher + ")"; return "hasSuperMethodMatcher(" + matcher + ")";
} }
} }
private static TypeDefinition safeGetSuperClass(final TypeDefinition typeDefinition) {
try {
return typeDefinition.getSuperClass();
} catch (final Exception e) {
log.debug(
"{} trying to get super class for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
public static class SafeExtendsClassMatcher<T extends TypeDescription>
extends ElementMatcher.Junction.AbstractBase<T> {
private final ElementMatcher<? super TypeDescription.Generic> matcher;
public SafeExtendsClassMatcher(final ElementMatcher<? super TypeDescription.Generic> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final T target) {
// We do not use foreach loop and iterator interface here because we need to catch exceptions
// in {@code getSuperClass} calls
TypeDefinition typeDefinition = target;
while (typeDefinition != null) {
if (matcher.matches(typeDefinition.asGenericType())) {
return true;
}
typeDefinition = safeGetSuperClass(typeDefinition);
}
return false;
}
}
} }