@Override public List<ResolvedReferenceType> getInterfacesExtended() { List<ResolvedReferenceType> res = new ArrayList<>(); for (Class i : clazz.getInterfaces()) { res.add(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(i, typeSolver), typeSolver)); } return res; }
@Override public List<ResolvedReferenceType> getInterfacesExtended() { List<ResolvedReferenceType> res = new ArrayList<>(); for (Class i : clazz.getInterfaces()) { res.add(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(i, typeSolver), typeSolver)); } return res; }
@Override public List<ResolvedReferenceType> getInterfacesExtended() { List<ResolvedReferenceType> res = new ArrayList<>(); for (Class i : clazz.getInterfaces()) { res.add(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(i, typeSolver), typeSolver)); } return res; }
@Override public ResolvedReferenceTypeDeclaration declaringType() { if (method.getDeclaringClass().isInterface()) { return new ReflectionInterfaceDeclaration(method.getDeclaringClass(), typeSolver); } if (method.getDeclaringClass().isEnum()) { return new ReflectionEnumDeclaration(method.getDeclaringClass(), typeSolver); } else { return new ReflectionClassDeclaration(method.getDeclaringClass(), typeSolver); } }
@Override public ResolvedReferenceTypeDeclaration declaringType() { if (method.getDeclaringClass().isInterface()) { return new ReflectionInterfaceDeclaration(method.getDeclaringClass(), typeSolver); } if (method.getDeclaringClass().isEnum()) { return new ReflectionEnumDeclaration(method.getDeclaringClass(), typeSolver); } else { return new ReflectionClassDeclaration(method.getDeclaringClass(), typeSolver); } }
@Override public ResolvedReferenceTypeDeclaration declaringType() { if (method.getDeclaringClass().isInterface()) { return new ReflectionInterfaceDeclaration(method.getDeclaringClass(), typeSolver); } if (method.getDeclaringClass().isEnum()) { return new ReflectionEnumDeclaration(method.getDeclaringClass(), typeSolver); } else { return new ReflectionClassDeclaration(method.getDeclaringClass(), typeSolver); } }
public static ResolvedReferenceTypeDeclaration typeDeclarationFor(Class<?> clazz, TypeSolver typeSolver) { if (clazz.isArray()) { throw new IllegalArgumentException("No type declaration available for an Array"); } else if (clazz.isPrimitive()) { throw new IllegalArgumentException(); } else if (clazz.isInterface()) { return new ReflectionInterfaceDeclaration(clazz, typeSolver); } else if (clazz.isEnum()) { return new ReflectionEnumDeclaration(clazz, typeSolver); } else { return new ReflectionClassDeclaration(clazz, typeSolver); } }
public static ResolvedReferenceTypeDeclaration typeDeclarationFor(Class<?> clazz, TypeSolver typeSolver) { if (clazz.isArray()) { throw new IllegalArgumentException("No type declaration available for an Array"); } else if (clazz.isPrimitive()) { throw new IllegalArgumentException(); } else if (clazz.isInterface()) { return new ReflectionInterfaceDeclaration(clazz, typeSolver); } else if (clazz.isEnum()) { return new ReflectionEnumDeclaration(clazz, typeSolver); } else { return new ReflectionClassDeclaration(clazz, typeSolver); } }
@Test public void testTypeParametersValues() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedReferenceType stream = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Stream.class, typeResolver), typeResolver); assertEquals(1, stream.typeParametersValues().size()); assertEquals(new ResolvedTypeVariable(new ReflectionInterfaceDeclaration(Stream.class, typeResolver).getTypeParameters().get(0)), stream.typeParametersValues().get(0)); }
@Test public void testAllAncestors() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver); Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); list.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); assertEquals(3, ancestors.size()); ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(list.getTypeParameters().get(0)); assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.util.Collection")); assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.lang.Iterable")); }
@Test public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForInterface() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver); ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); ResolvedReferenceType listOfString = new ReferenceTypeImpl(list, ImmutableList.of(string), typeResolver); Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); listOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); assertEquals(3, ancestors.size()); assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection")); assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable")); }
@Test public void testGetFunctionalMethodPositiveCasesOnInterfaces() { TypeSolver typeSolver = new ReflectionTypeSolver(); ResolvedType function = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Function.class, typeSolver), typeSolver); assertEquals(true, FunctionalInterfaceLogic.getFunctionalMethod(function).isPresent()); assertEquals("apply", FunctionalInterfaceLogic.getFunctionalMethod(function).get().getName()); ResolvedType consumer = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Consumer.class, typeSolver), typeSolver); assertEquals(true, FunctionalInterfaceLogic.getFunctionalMethod(consumer).isPresent()); assertEquals("accept", FunctionalInterfaceLogic.getFunctionalMethod(consumer).get().getName()); } }
@Test public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassAbstractCollection() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedClassDeclaration abstractCollection = new ReflectionClassDeclaration(AbstractCollection.class, typeResolver); ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); ResolvedReferenceType abstractCollectionOfString = new ReferenceTypeImpl(abstractCollection, ImmutableList.of(string), typeResolver); Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); abstractCollectionOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); assertEquals(3, ancestors.size()); assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection")); assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable")); }
@Test public void testGetSignature() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedClassDeclaration object = new ReflectionClassDeclaration(Object.class, typeResolver); ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver); ResolvedMethodDeclaration hashCode = object.getAllMethods().stream().filter(m -> m.getName().equals("hashCode")).findFirst().get().getDeclaration(); ResolvedMethodDeclaration equals = object.getAllMethods().stream().filter(m -> m.getName().equals("equals")).findFirst().get().getDeclaration(); ResolvedMethodDeclaration containsAll = list.getAllMethods().stream().filter(m -> m.getName().equals("containsAll")).findFirst().get().getDeclaration(); ResolvedMethodDeclaration subList = list.getAllMethods().stream().filter(m -> m.getName().equals("subList")).findFirst().get().getDeclaration(); assertEquals("hashCode()", hashCode.getSignature()); assertEquals("equals(java.lang.Object)", equals.getSignature()); assertEquals("containsAll(java.util.Collection<? extends java.lang.Object>)", containsAll.getSignature()); assertEquals("subList(int, int)", subList.getSignature()); }
@Before public void setup() { typeSolver = new ReflectionTypeSolver(); OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver); STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver); arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN); arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl( new ReflectionInterfaceDeclaration(List.class, typeSolver), ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver)); }
@Before public void setup() { typeSolver = new ReflectionTypeSolver(); OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver); STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver); arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN); arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl( new ReflectionInterfaceDeclaration(List.class, typeSolver), ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver)); }
@Test public void charSequenceIsAssignableToObject() { TypeSolver typeSolver = new ReflectionTypeSolver(); ReferenceTypeImpl charSequence = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(CharSequence.class, typeSolver), typeSolver); ReferenceTypeImpl object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver); assertEquals(false, charSequence.isAssignableBy(object)); assertEquals(true, object.isAssignableBy(charSequence)); }
@Test public void testGetGenericReturnType() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedInterfaceDeclaration map = new ReflectionInterfaceDeclaration(Map.class, typeResolver); ResolvedMethodDeclaration put = map.getAllMethods().stream().filter(m -> m.getName().equals("put")).findFirst().get().getDeclaration(); assertEquals(true, put.getReturnType().isTypeVariable()); assertEquals(true, put.getReturnType().asTypeParameter().declaredOnType()); assertEquals("java.util.Map.V", put.getReturnType().asTypeParameter().getQualifiedName()); }
@Test public void testReplaceTypeVariablesWithLambdaInBetween() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedInterfaceDeclaration streamInterface = new ReflectionInterfaceDeclaration(Stream.class, typeResolver); ResolvedReferenceType stream = new ReferenceTypeImpl(streamInterface, typeResolver); ResolvedMethodDeclaration streamMap = streamInterface.getDeclaredMethods().stream().filter(m -> m.getName().equals("map")).findFirst().get(); ResolvedTypeParameterDeclaration streamMapR = streamMap.findTypeParameter("T").get(); ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(streamMapR); stream = stream.deriveTypeParameters(stream.typeParametersMap().toBuilder().setValue(stream.getTypeDeclaration().getTypeParameters().get(0), typeVariable).build()); ResolvedTypeParameterDeclaration tpToReplace = streamInterface.getTypeParameters().get(0); ResolvedType replaced = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); ResolvedType streamReplaced = stream.replaceTypeVariables(tpToReplace, replaced); assertEquals("java.util.stream.Stream<java.lang.String>", streamReplaced.describe()); }
@Test public void testGetGenericParameters() { TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedInterfaceDeclaration map = new ReflectionInterfaceDeclaration(Map.class, typeResolver); ResolvedMethodDeclaration put = map.getAllMethods().stream().filter(m -> m.getName().equals("put")).findFirst().get().getDeclaration(); assertEquals(true, put.getParam(0).getType().isTypeVariable()); assertEquals(true, put.getParam(0).getType().asTypeParameter().declaredOnType()); assertEquals("java.util.Map.K", put.getParam(0).getType().asTypeParameter().getQualifiedName()); assertEquals(true, put.getParam(1).getType().isTypeVariable()); assertEquals(true, put.getParam(1).getType().asTypeParameter().declaredOnType()); assertEquals("java.util.Map.V", put.getParam(1).getType().asTypeParameter().getQualifiedName()); } }