의존성 주입을 배우면서 접근제어자가 private인데도 참조값을 주입하는거 보고 어떻게 가능한지 찾아보다가 자바 리플렉션에 대해 공부하게 되었다.
그러던 중 "자바에서 private 접근 제어자는 외부에서 절대 접근 못해!!!" 라는 나의 순수한 동심이 방금 깨졌다
package com.spring.basic.core.reflection;
public class ForReflection {
public ForReflection() {
}
public void sayHello() {
System.out.println("Hello world!");
}
private void secret() {
System.out.println("이건 비밀 메서드인데;;");
}
}
위와 같이 정의된 클래스가 있다고 한다면 외부에서는 절대 secret메서드를 호출하지 못할거라고 믿어왔다...
그러나
package com.spring.basic.core.reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionTest {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ForReflection forReflection = new ForReflection();
Class<?> clazz = ForReflection.class;
Method sayHello = clazz.getMethod("sayHello");
sayHello.invoke(forReflection);
Method secret = clazz.getDeclaredMethod("secret");
secret.setAccessible(true);
secret.invoke(forReflection);
}
}
위 와같이 작성하고 실행한다면

와우... 너무 신기하기도 하고 어떻게 private인데도 의존성 주입이 되는건지에 대한 궁금증이 해소되어서 기부니가 좋다.