package net.bytebuddy.matcher; import lombok.EqualsAndHashCode; import net.bytebuddy.description.method.MethodDescription; /** * Matches a method description by its general characteristics which are represented as a * {@link net.bytebuddy.matcher.MethodSortMatcher.Sort}. * * @param <T> The type of the matched entity. */ @EqualsAndHashCode(callSuper = false) public class MethodSortMatcher<T extends MethodDescription> extends ElementMatcher.Junction.AbstractBase<T> { /** * The sort of method description to be matched by this element matcher. */ private final Sort sort; /** * Creates a new element matcher that matches a specific sort of method description. * * @param sort The sort of method description to be matched by this element matcher. */ public MethodSortMatcher(Sort sort) { this.sort = sort; } @Override public boolean matches(T target) { return sort.isSort(target); } @Override public String toString() { return sort.getDescription(); } /** * Represents a specific characteristic of a method description. */ public enum Sort { /** * Matches method descriptions that represent methods, not constructors or the type initializer. */ METHOD("isMethod()") { @Override protected boolean isSort(MethodDescription target) { return target.isMethod(); } }, /** * Matches method descriptions that represent constructors, not methods or the type initializer. */ CONSTRUCTOR("isConstructor()") { @Override protected boolean isSort(MethodDescription target) { return target.isConstructor(); } }, /** * Matches method descriptions that represent the type initializers. */ TYPE_INITIALIZER("isTypeInitializer()") { @Override protected boolean isSort(MethodDescription target) { return target.isTypeInitializer(); } }, /** * Matches method descriptions that are overridable. */ VIRTUAL("isVirtual()") { @Override protected boolean isSort(MethodDescription target) { return target.isVirtual(); } }, /** * Matches method descriptions that represent Java 8 default methods. */ DEFAULT_METHOD("isDefaultMethod()") { @Override protected boolean isSort(MethodDescription target) { return target.isDefaultMethod(); } }; /** * A textual representation of the method sort that is represented by this instance. */ private final String description; /** * Creates a new method sort representation. * * @param description A textual representation of the method sort that is represented by this instance. */ Sort(String description) { this.description = description; } /** * Determines if a method description is of the represented method sort. * * @param target A textual representation of the method sort that is represented by this instance. * @return {@code true} if the given method if of the method sort that is represented by this instance. */ protected abstract boolean isSort(MethodDescription target); /** * Returns a textual representation of this instance's method sort. * * @return A textual representation of this instance's method sort. */ protected String getDescription() { return description; } @Override public String toString() { return "MethodSortMatcher.Sort." + name(); } } }