Skip to content

Commit 3f253c8

Browse files
Merge pull request #15742 from parthiv39731/PR-7319
BAEL-7396, Instantiate an Inner Class With Reflection in Java
2 parents bd2120a + d12f30c commit 3f253c8

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.baeldung.reflection.innerclass;
2+
3+
public class Person {
4+
String name;
5+
Address address;
6+
7+
public Person() {
8+
}
9+
10+
public class Address {
11+
String zip;
12+
13+
public Address(String zip) {
14+
this.zip = zip;
15+
}
16+
}
17+
18+
public static class Builder {
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.baeldung.reflection.innerclass;
2+
3+
import java.lang.reflect.Constructor;
4+
import java.lang.reflect.InvocationTargetException;
5+
import java.util.Arrays;
6+
import java.util.stream.Collectors;
7+
8+
import static org.junit.jupiter.api.Assertions.*;
9+
import org.junit.jupiter.api.Test;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
13+
public class CreateInnerClassWithReflectionUnitTest {
14+
15+
static Logger logger = LoggerFactory.getLogger(CreateInnerClassWithReflectionUnitTest.class);
16+
17+
@Test
18+
void givenInnerClass_whenUseReflection_thenShowConstructors() {
19+
final String personBuilderClassName = "com.baeldung.reflection.innerclass.Person$Builder";
20+
final String personAddressClassName = "com.baeldung.reflection.innerclass.Person$Address";
21+
assertDoesNotThrow(() -> logConstructors(Class.forName(personAddressClassName)));
22+
assertDoesNotThrow(() -> logConstructors(Class.forName(personBuilderClassName)));
23+
}
24+
25+
private static void logConstructors(Class<?> clazz) {
26+
Arrays.stream(clazz.getDeclaredConstructors())
27+
.map(c -> formatConstructorSignature(c))
28+
.forEach(logger::info);
29+
}
30+
31+
private static String formatConstructorSignature(Constructor<?> constructor) {
32+
String params = Arrays.stream(constructor.getParameters())
33+
.map(parameter -> parameter.getType().getSimpleName() + " " + parameter.getName())
34+
.collect(Collectors.joining(", "));
35+
return constructor.getName() + "(" + params + ")";
36+
}
37+
38+
@Test
39+
void givenStaticInnerClass_whenUseReflection_thenInstantiate()
40+
throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
41+
InstantiationException, IllegalAccessException {
42+
final String personBuilderClassName = "com.baeldung.reflection.innerclass.Person$Builder";
43+
Class<Person.Builder> personBuilderClass = (Class<Person.Builder>) Class.forName(personBuilderClassName);
44+
Person.Builder personBuilderObj = personBuilderClass.getDeclaredConstructor().newInstance();
45+
assertTrue(personBuilderObj instanceof Person.Builder);
46+
}
47+
48+
@Test
49+
void givenNonStaticInnerClass_whenUseReflection_thenInstantiate()
50+
throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
51+
InstantiationException, IllegalAccessException {
52+
final String personClassName = "com.baeldung.reflection.innerclass.Person";
53+
final String personAddressClassName = "com.baeldung.reflection.innerclass.Person$Address";
54+
55+
Class<Person> personClass = (Class<Person>) Class.forName(personClassName);
56+
Person personObj = personClass.getConstructor().newInstance();
57+
58+
Class<Person.Address> personAddressClass = (Class<Person.Address>) Class.forName(personAddressClassName);
59+
60+
assertThrows(NoSuchMethodException.class, () -> personAddressClass.getDeclaredConstructor(String.class));
61+
62+
Constructor<Person.Address> constructorOfPersonAddress = personAddressClass.getDeclaredConstructor(Person.class, String.class);
63+
Person.Address personAddressObj = constructorOfPersonAddress.newInstance(personObj, "751003");
64+
assertTrue(personAddressObj instanceof Person.Address);
65+
}
66+
67+
}

0 commit comments

Comments
 (0)