From 73ceac2bf3f49c110327a363ba3e1e7663568045 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:53:56 +0530 Subject: [PATCH] BAEL-7396, Instantiate an Inner Class With Reflection in Java --- .../reflection/innerclass/Person.java | 20 ++++++ ...reateInnerClassWithReflectionUnitTest.java | 67 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/innerclass/Person.java create mode 100644 core-java-modules/core-java-reflection-3/src/test/java/com/baeldung/reflection/innerclass/CreateInnerClassWithReflectionUnitTest.java diff --git a/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/innerclass/Person.java b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/innerclass/Person.java new file mode 100644 index 0000000000..d226aad268 --- /dev/null +++ b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/innerclass/Person.java @@ -0,0 +1,20 @@ +package com.baeldung.reflection.innerclass; + +public class Person { + String name; + Address address; + + public Person() { + } + + public class Address { + String zip; + + public Address(String zip) { + this.zip = zip; + } + } + + public static class Builder { + } +} diff --git a/core-java-modules/core-java-reflection-3/src/test/java/com/baeldung/reflection/innerclass/CreateInnerClassWithReflectionUnitTest.java b/core-java-modules/core-java-reflection-3/src/test/java/com/baeldung/reflection/innerclass/CreateInnerClassWithReflectionUnitTest.java new file mode 100644 index 0000000000..2654cb646d --- /dev/null +++ b/core-java-modules/core-java-reflection-3/src/test/java/com/baeldung/reflection/innerclass/CreateInnerClassWithReflectionUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.reflection.innerclass; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateInnerClassWithReflectionUnitTest { + + static Logger logger = LoggerFactory.getLogger(CreateInnerClassWithReflectionUnitTest.class); + + @Test + void givenInnerClass_whenUseReflection_thenShowConstructors() { + final String personBuilderClassName = "com.baeldung.reflection.innerclass.Person$Builder"; + final String personAddressClassName = "com.baeldung.reflection.innerclass.Person$Address"; + assertDoesNotThrow(() -> logConstructors(Class.forName(personAddressClassName))); + assertDoesNotThrow(() -> logConstructors(Class.forName(personBuilderClassName))); + } + + private static void logConstructors(Class clazz) { + Arrays.stream(clazz.getDeclaredConstructors()) + .map(c -> formatConstructorSignature(c)) + .forEach(logger::info); + } + + private static String formatConstructorSignature(Constructor constructor) { + String params = Arrays.stream(constructor.getParameters()) + .map(parameter -> parameter.getType().getSimpleName() + " " + parameter.getName()) + .collect(Collectors.joining(", ")); + return constructor.getName() + "(" + params + ")"; + } + + @Test + void givenStaticInnerClass_whenUseReflection_thenInstantiate() + throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, + InstantiationException, IllegalAccessException { + final String personBuilderClassName = "com.baeldung.reflection.innerclass.Person$Builder"; + Class personBuilderClass = (Class) Class.forName(personBuilderClassName); + Person.Builder personBuilderObj = personBuilderClass.getDeclaredConstructor().newInstance(); + assertTrue(personBuilderObj instanceof Person.Builder); + } + + @Test + void givenNonStaticInnerClass_whenUseReflection_thenInstantiate() + throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, + InstantiationException, IllegalAccessException { + final String personClassName = "com.baeldung.reflection.innerclass.Person"; + final String personAddressClassName = "com.baeldung.reflection.innerclass.Person$Address"; + + Class personClass = (Class) Class.forName(personClassName); + Person personObj = personClass.getConstructor().newInstance(); + + Class personAddressClass = (Class) Class.forName(personAddressClassName); + + assertThrows(NoSuchMethodException.class, () -> personAddressClass.getDeclaredConstructor(String.class)); + + Constructor constructorOfPersonAddress = personAddressClass.getDeclaredConstructor(Person.class, String.class); + Person.Address personAddressObj = constructorOfPersonAddress.newInstance(personObj, "751003"); + assertTrue(personAddressObj instanceof Person.Address); + } + +}