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());
+ }
+
+}