신기해서 적어보는 동심파괴 자바 리플렉션

유현호·2025년 4월 16일
0

의존성 주입을 배우면서 접근제어자가 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인데도 의존성 주입이 되는건지에 대한 궁금증이 해소되어서 기부니가 좋다.

profile
제가 학습하고 기록하고 싶은 내용들을 지극히 개인적으로 기록하고 있습니다.

0개의 댓글