From 4bc42f14a94ea7a851d6a8be688e86f18bf1af40 Mon Sep 17 00:00:00 2001 From: Sarath Date: Sat, 8 May 2021 02:29:00 +0530 Subject: [PATCH 1/2] [BAEL-4279] Finding All Classes in a Java Package --- .../core-java-reflection-2/pom.xml | 10 ++++ .../AccessingAllClassesInPackage.java | 54 +++++++++++++++++++ .../access/packages/search/ClassExample.java | 6 +++ .../packages/search/InterfaceExample.java | 4 ++ .../access/packages/search/Searchable.java | 5 ++ .../access/packages/search/package-info.java | 2 + .../AccessingAllClassesInPackageUnitTest.java | 39 ++++++++++++++ 7 files changed, 120 insertions(+) create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java create mode 100644 core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml index 02a806f87c..e6bfe259db 100644 --- a/core-java-modules/core-java-reflection-2/pom.xml +++ b/core-java-modules/core-java-reflection-2/pom.xml @@ -21,6 +21,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..7da8e224ee --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java @@ -0,0 +1,54 @@ +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 com.google.common.reflect.ClassPath; + +@SuppressWarnings("rawtypes") +public class AccessingAllClassesInPackage { + + 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) { + e.printStackTrace(); + } + 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()); + } + +} From 29552100ca217378b7c7ce93ecd4ae91286898ad Mon Sep 17 00:00:00 2001 From: Sarath Date: Thu, 13 May 2021 13:11:38 +0530 Subject: [PATCH 2/2] [BAEL-4279] Formatting --- core-java-modules/core-java-reflection-2/pom.xml | 12 ++++++------ .../packages/AccessingAllClassesInPackage.java | 6 +++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml index e6bfe259db..b887f95823 100644 --- a/core-java-modules/core-java-reflection-2/pom.xml +++ b/core-java-modules/core-java-reflection-2/pom.xml @@ -22,14 +22,14 @@ test - org.reflections - reflections - 0.9.12 + org.reflections + reflections + 0.9.12 - com.google.guava - guava - 30.1.1-jre + 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 index 7da8e224ee..dfbfaca270 100644 --- 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 @@ -9,12 +9,16 @@ 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("[.]", "/")); @@ -29,7 +33,7 @@ public class AccessingAllClassesInPackage { try { return Class.forName(packageName + "." + className.substring(0, className.lastIndexOf('.'))); } catch (ClassNotFoundException e) { - e.printStackTrace(); + LOG.error("<>"); } return null; }