/** * Get the functional method defined by the type, if any. */ public static Optional<MethodUsage> getFunctionalMethod(ResolvedReferenceTypeDeclaration typeDeclaration) { //We need to find all abstract methods Set<MethodUsage> methods = typeDeclaration.getAllMethods().stream() .filter(m -> m.getDeclaration().isAbstract()) // Remove methods inherited by Object: // Consider the case of Comparator which define equals. It would be considered a functional method. .filter(m -> !declaredOnObject(m)) .collect(Collectors.toSet()); if (methods.size() == 1) { return Optional.of(methods.iterator().next()); } else { return Optional.empty(); } }
@Test public void testGetDeclaredMethods() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedReferenceTypeDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver); List<ResolvedMethodDeclaration> methods = list.getDeclaredMethods().stream() .sorted((a, b) -> a.getName().compareTo(b.getName())) .collect(Collectors.toList()); assertEquals(28, methods.size()); assertEquals("clear", methods.get(4).getName()); assertEquals(true, methods.get(4).isAbstract()); assertEquals(0, methods.get(4).getNumberOfParams()); assertEquals("contains", methods.get(5).getName()); assertEquals(true, methods.get(5).isAbstract()); assertEquals(1, methods.get(5).getNumberOfParams()); assertEquals(true, methods.get(5).getParam(0).getType().isReferenceType()); assertEquals(Object.class.getCanonicalName(), methods.get(5).getParam(0).getType().asReferenceType().getQualifiedName()); }
@Test public void testGetDeclaredMethods() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedReferenceTypeDeclaration string = new ReflectionClassDeclaration(String.class, typeResolver); List<ResolvedMethodDeclaration> methods = string.getDeclaredMethods().stream() .filter(m -> m.accessSpecifier() != AccessSpecifier.PRIVATE && m.accessSpecifier() != AccessSpecifier.DEFAULT) .sorted((a, b) -> a.getName().compareTo(b.getName())) .collect(Collectors.toList()); assertEquals(67, methods.size()); assertEquals("charAt", methods.get(0).getName()); assertEquals(false, methods.get(0).isAbstract()); assertEquals(1, methods.get(0).getNumberOfParams()); assertEquals("int", methods.get(0).getParam(0).getType().describe()); assertEquals("concat", methods.get(6).getName()); assertEquals(false, methods.get(6).isAbstract()); assertEquals(1, methods.get(6).getNumberOfParams()); assertEquals("java.lang.String", methods.get(6).getParam(0).getType().describe()); }