Merge pull request #10743 from tirumani03/dev/tirumani03/findingClassesInPackage
[BAEL-4279] Finding All Classes in a Java Package
This commit is contained in:
commit
1c9bccca01
@ -22,6 +22,16 @@
|
|||||||
<version>${spring.version}</version>
|
<version>${spring.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.reflections</groupId>
|
||||||
|
<artifactId>reflections</artifactId>
|
||||||
|
<version>0.9.12</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>30.1.1-jre</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -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<Class> 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("<<Class not found>>");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Class> findAllClassesUsingReflectionsLibrary(String packageName) {
|
||||||
|
Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
|
||||||
|
return reflections.getSubTypesOf(Object.class)
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Class> 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.baeldung.reflection.access.packages.search;
|
||||||
|
|
||||||
|
public class ClassExample {
|
||||||
|
class NestedClassExample {
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.baeldung.reflection.access.packages.search;
|
||||||
|
|
||||||
|
public interface InterfaceExample {
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.baeldung.reflection.access.packages.search;
|
||||||
|
|
||||||
|
public @interface Searchable {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
@Searchable
|
||||||
|
package com.baeldung.reflection.access.packages.search;
|
@ -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<Class> classes = instance.findAllClassesUsingClassLoader(PACKAGE_NAME);
|
||||||
|
Assertions.assertEquals(5, classes.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void when_findAllClassesUsingReflectionsLibrary_thenSuccess() {
|
||||||
|
AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage();
|
||||||
|
Set<Class> classes = instance.findAllClassesUsingReflectionsLibrary(PACKAGE_NAME);
|
||||||
|
Assertions.assertEquals(5, classes.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void when_findAllClassesUsingGoogleGuice_thenSuccess() throws IOException {
|
||||||
|
AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage();
|
||||||
|
Set<Class> classes = instance.findAllClassesUsingGoogleGuice(PACKAGE_NAME);
|
||||||
|
Assertions.assertEquals(5, classes.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user