[BAEL-6794] Is Java Reflection Bad Practice?

This commit is contained in:
ovidiu-mihai98 2023-09-30 23:21:21 +03:00
parent a93751923d
commit db9dc5f286
6 changed files with 154 additions and 0 deletions

View File

@ -0,0 +1,11 @@
package com.baeldung.reflection.disadvantages.encapsulation;
public class MyClass {
private String veryPrivateField;
public MyClass() {
this.veryPrivateField = "Secret Information";
}
}

View File

@ -0,0 +1,7 @@
package com.baeldung.reflection.disadvantages.performance;
public class BenchmarkRunner {
public static void main(String[] args) throws Exception {
org.openjdk.jmh.Main.main(args);
}
}

View File

@ -0,0 +1,29 @@
package com.baeldung.reflection.disadvantages.performance;
import org.openjdk.jmh.annotations.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.TimeUnit;
public class InitializationBenchmark {
@Benchmark
@Fork(value = 1, warmups = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void directInit() {
Person person = new Person("John", "Doe", 50);
}
@Benchmark
@Fork(value = 1, warmups = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void reflectiveInit() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Constructor<Person> constructor = Person.class.getDeclaredConstructor(String.class, String.class, Integer.class);
Person person = constructor.newInstance("John", "Doe", 50);
}
}

View File

@ -0,0 +1,48 @@
package com.baeldung.reflection.disadvantages.performance;
import org.openjdk.jmh.annotations.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
public class MethodInvocationBenchmark {
@Benchmark
@Fork(value = 1, warmups = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void directCall() {
directCall(new Person("John", "Doe", 50));
}
@Benchmark
@Fork(value = 1, warmups = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void reflectiveCall() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
reflectiveCall(new Person("John", "Doe", 50));
}
private void directCall(Person person) {
person.getFirstName();
person.getLastName();
person.getAge();
}
private void reflectiveCall(Person person) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method getFirstNameMethod = Person.class.getMethod("getFirstName");
getFirstNameMethod.invoke(person);
Method getLastNameMethod = Person.class.getMethod("getLastName");
getLastNameMethod.invoke(person);
Method getAgeMethod = Person.class.getMethod("getAge");
getAgeMethod.invoke(person);
}
}

View File

@ -0,0 +1,38 @@
package com.baeldung.reflection.disadvantages.performance;
public class Person {
private String firstName;
private String lastName;
private Integer age;
public Person(String firstName, String lastName, Integer age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}

View File

@ -0,0 +1,21 @@
package com.baeldung.reflection.disadvantages.encapsulation;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class ReflectionEncapsulationUnitTest {
@Test
public void givenPrivateField_whenUsingReflection_thenIsAccessible() throws IllegalAccessException, NoSuchFieldException {
MyClass myClassInstance = new MyClass();
Field privateField = MyClass.class.getDeclaredField("veryPrivateField");
privateField.setAccessible(true);
String accessedField = privateField.get(myClassInstance).toString();
assertEquals(accessedField, "Secret Information");
}
}