diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml index 74a7328c16..347f986275 100644 --- a/core-java-modules/core-java-reflection-2/pom.xml +++ b/core-java-modules/core-java-reflection-2/pom.xml @@ -22,6 +22,16 @@ ${spring.version} test + + org.reflections + reflections + 0.9.12 + + + com.google.guava + guava + 30.1.1-jre + diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java new file mode 100644 index 0000000000..dfbfaca270 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java @@ -0,0 +1,58 @@ +package com.baeldung.reflection.access.packages; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Set; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.reflect.ClassPath; + +@SuppressWarnings("rawtypes") +public class AccessingAllClassesInPackage { + + private static final Logger LOG = LoggerFactory.getLogger(AccessingAllClassesInPackage.class); + + public Set findAllClassesUsingClassLoader(String packageName) { + InputStream stream = ClassLoader.getSystemClassLoader() + .getResourceAsStream(packageName.replaceAll("[.]", "/")); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + return reader.lines() + .filter(line -> line.endsWith(".class")) + .map(line -> getClass(line, packageName)) + .collect(Collectors.toSet()); + } + + private Class getClass(String className, String packageName) { + try { + return Class.forName(packageName + "." + className.substring(0, className.lastIndexOf('.'))); + } catch (ClassNotFoundException e) { + LOG.error("<>"); + } + return null; + } + + public Set findAllClassesUsingReflectionsLibrary(String packageName) { + Reflections reflections = new Reflections(packageName, new SubTypesScanner(false)); + return reflections.getSubTypesOf(Object.class) + .stream() + .collect(Collectors.toSet()); + } + + public Set findAllClassesUsingGoogleGuice(String packageName) throws IOException { + return ClassPath.from(ClassLoader.getSystemClassLoader()) + .getAllClasses() + .stream() + .filter(clazz -> clazz.getPackageName() + .equalsIgnoreCase(packageName)) + .map(clazz -> clazz.load()) + .collect(Collectors.toSet()); + } + +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java new file mode 100644 index 0000000000..d1ff027770 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java @@ -0,0 +1,6 @@ +package com.baeldung.reflection.access.packages.search; + +public class ClassExample { + class NestedClassExample { + } +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java new file mode 100644 index 0000000000..340c552da8 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java @@ -0,0 +1,4 @@ +package com.baeldung.reflection.access.packages.search; + +public interface InterfaceExample { +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java new file mode 100644 index 0000000000..6f4180a136 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java @@ -0,0 +1,5 @@ +package com.baeldung.reflection.access.packages.search; + +public @interface Searchable { + +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java new file mode 100644 index 0000000000..f920000b92 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java @@ -0,0 +1,2 @@ +@Searchable +package com.baeldung.reflection.access.packages.search; \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java new file mode 100644 index 0000000000..5bee2c0f3e --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.reflection.access.packages; + +import java.io.IOException; +import java.util.Set; + +import org.junit.Rule; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.rules.ExpectedException; + +@SuppressWarnings("rawtypes") +public class AccessingAllClassesInPackageUnitTest { + @Rule + public final ExpectedException exception = ExpectedException.none(); + + private static final String PACKAGE_NAME = "com.baeldung.reflection.access.packages.search"; + + @Test + public void when_findAllClassesUsingClassLoader_thenSuccess() { + AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage(); + Set classes = instance.findAllClassesUsingClassLoader(PACKAGE_NAME); + Assertions.assertEquals(5, classes.size()); + } + + @Test + public void when_findAllClassesUsingReflectionsLibrary_thenSuccess() { + AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage(); + Set classes = instance.findAllClassesUsingReflectionsLibrary(PACKAGE_NAME); + Assertions.assertEquals(5, classes.size()); + } + + @Test + public void when_findAllClassesUsingGoogleGuice_thenSuccess() throws IOException { + AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage(); + Set classes = instance.findAllClassesUsingGoogleGuice(PACKAGE_NAME); + Assertions.assertEquals(5, classes.size()); + } + +}