diff --git a/core-java-modules/core-java-lang-5/pom.xml b/core-java-modules/core-java-lang-5/pom.xml
index 6d3771bd31..767ebb6e35 100644
--- a/core-java-modules/core-java-lang-5/pom.xml
+++ b/core-java-modules/core-java-lang-5/pom.xml
@@ -13,6 +13,12 @@
core-java-modules
0.0.1-SNAPSHOT
+
+
+ 3.12.0
+ 0.10.2
+
+
core-java-lang-5
@@ -24,4 +30,18 @@
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.reflections
+ reflections
+ ${reflections.version}
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildClass1.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildClass1.java
new file mode 100644
index 0000000000..fb91223a97
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildClass1.java
@@ -0,0 +1,5 @@
+package com.baeldung.checkinterface;
+
+public class ChildClass1 implements ChildInterface1 {
+
+}
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildClass2.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildClass2.java
new file mode 100644
index 0000000000..2d5958784d
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildClass2.java
@@ -0,0 +1,5 @@
+package com.baeldung.checkinterface;
+
+public class ChildClass2 implements ChildInterface2 {
+
+}
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildInterface1.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildInterface1.java
new file mode 100644
index 0000000000..8a2ad5f345
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildInterface1.java
@@ -0,0 +1,5 @@
+package com.baeldung.checkinterface;
+
+public interface ChildInterface1 extends MasterInterface {
+
+}
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildInterface2.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildInterface2.java
new file mode 100644
index 0000000000..cff662edf0
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/ChildInterface2.java
@@ -0,0 +1,5 @@
+package com.baeldung.checkinterface;
+
+public interface ChildInterface2 extends MasterInterface {
+
+}
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/MasterClass.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/MasterClass.java
new file mode 100644
index 0000000000..29f3ed5fe8
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/MasterClass.java
@@ -0,0 +1,5 @@
+package com.baeldung.checkinterface;
+
+public class MasterClass implements MasterInterface {
+
+}
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/MasterInterface.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/MasterInterface.java
new file mode 100644
index 0000000000..6aefb8b6e6
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/checkinterface/MasterInterface.java
@@ -0,0 +1,5 @@
+package com.baeldung.checkinterface;
+
+public interface MasterInterface {
+
+}
diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/checkinterface/CheckInterfaceUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/checkinterface/CheckInterfaceUnitTest.java
new file mode 100644
index 0000000000..dcbbb7eb05
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/checkinterface/CheckInterfaceUnitTest.java
@@ -0,0 +1,154 @@
+package com.baeldung.checkinterface;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.ClassUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.reflections.ReflectionUtils;
+import org.reflections.Reflections;
+
+public class CheckInterfaceUnitTest {
+
+ protected static Reflections reflections;
+
+ @BeforeAll
+ public static void initializeReflectionsLibrary() {
+
+ reflections = new Reflections("com.baeldung.checkinterface");
+ }
+
+ @Test
+ public void whenUsingReflectionGetInterfaces_thenDirectlyImplementedInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+ List> interfaces = Arrays.asList(childClass2.getClass().getInterfaces());
+
+ assertEquals(1, interfaces.size());
+ assertTrue(interfaces.contains(ChildInterface2.class));
+ }
+
+ @Test
+ public void whenUsingReflectionGetInterfaces_thenParentInterfaceIsNotFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+ List> interfaces = Arrays.asList(childClass2.getClass().getInterfaces());
+
+ assertFalse(interfaces.contains(MasterInterface.class));
+ }
+
+ @Test
+ public void whenUsingReflectionGetInterfacesRecursively_thenParentInterfaceIsFound() {
+
+ Set> interfaces = getAllExtendedOrImplementedInterfacesRecursively(ChildClass2.class);
+
+ assertTrue(interfaces.contains(ChildInterface2.class));
+ assertTrue(interfaces.contains(MasterInterface.class));
+ }
+
+ @Test
+ public void whenUsingReflectionIsAssignableFrom_thenDirectlyImplementedInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+
+ assertTrue(ChildInterface2.class.isAssignableFrom(childClass2.getClass()));
+ }
+
+ @Test
+ public void whenUsingReflectionIsAssignableFrom_thenParentInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+
+ assertTrue(MasterInterface.class.isAssignableFrom(childClass2.getClass()));
+ }
+
+ @Test
+ public void whenUsingReflectionIsInstance_thenDirectlyImplementedInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+
+ assertTrue(ChildInterface2.class.isInstance(childClass2));
+ }
+
+ @Test
+ public void whenUsingReflectionIsInstance_thenParentInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+
+ assertTrue(MasterInterface.class.isInstance(childClass2));
+ }
+
+ @Test
+ public void whenUsingReflectionInstanceOf_thenDirectlyImplementedInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+
+ assertTrue(childClass2 instanceof ChildInterface2);
+ }
+
+ @Test
+ public void whenUsingReflectionInstanceOf_thenParentInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+
+ assertTrue(childClass2 instanceof MasterInterface);
+ }
+
+ @Test
+ public void whenUsingCommons_thenDirectlyImplementedInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+ List> interfaces = ClassUtils.getAllInterfaces(childClass2.getClass());
+
+ assertTrue(interfaces.contains(ChildInterface2.class));
+ }
+
+ @Test
+ public void whenUsingCommons_thenParentInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+ List> interfaces = ClassUtils.getAllInterfaces(childClass2.getClass());
+
+ assertTrue(interfaces.contains(MasterInterface.class));
+ }
+
+ @Test
+ public void whenUsingReflections_thenDirectlyImplementedInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+ Set> interfaces = reflections.get(ReflectionUtils.Interfaces.of(childClass2.getClass()));
+
+ assertTrue(interfaces.contains(ChildInterface2.class));
+ }
+
+ @Test
+ public void whenUsingReflections_thenParentInterfaceIsFound() {
+
+ ChildClass2 childClass2 = new ChildClass2();
+ Set> interfaces = reflections.get(ReflectionUtils.Interfaces.of(childClass2.getClass()));
+
+ assertTrue(interfaces.contains(MasterInterface.class));
+ }
+
+ static Set> getAllExtendedOrImplementedInterfacesRecursively(Class> clazz) {
+
+ Set> res = new HashSet>();
+ Class>[] interfaces = clazz.getInterfaces();
+
+ if (interfaces.length > 0) {
+ res.addAll(Arrays.asList(interfaces));
+ for (Class> interfaze : interfaces) {
+ res.addAll(getAllExtendedOrImplementedInterfacesRecursively(interfaze));
+ }
+ }
+
+ return res;
+ }
+}