본문 바로가기
JAVA/JAVA

자바 리플렉션(Reflection) 간단 정리

by 개미가되고싶은사람 2024. 9. 17.

목차

     

     

    리플렉션

    자바 리플렉션은 런타임 시점에서 클래스의 메타데이터를 분석하고, 객체의 속성이나 메소드를 동적으로 접근할 수 있는 기능을 제공합니다. 이를 통해 컴파일 시점이 아닌 실행 시점에 필요한 코드가 동적으로 생성되어 실행되도록 합니다.

    리플렉션의 장점

    • 유연성: 외부 라이브러리나 프레임워크 없이도 런타임에 클래스 정보를 얻고, 메소드를 호출하거나 속성을 변경할 수 있습니다.
    • 확장성: 새로운 기능을 추가하거나 변경할 때, 코드 수정 없이도 동적으로 처리할 수 있습니다.

    리플렉션의 단점

    • 성능 저하: 리플렉션을 사용하면 메소드나 필드에 접근하기 위해 추가적인 처리가 필요하기 때문에 일반적인 코드보다 느릴 수 있습니다.
    • 보안 문제: 내부 구현에 직접 접근하기 때문에 캡슐화를 위반할 수 있으며, 예상치 못한 에가 발생할 수 있습니다.

    리플렉션을 사용하는 간단한 방법 다음과 같습니다.

     

    리플렉션으로 클래스 가져오기

    // 1. 클래스가 로딩이 된 이후에 가져오는 방법
    Class<Hello> hello = Hello.class;
    
    // 2. 이미 선언된 인스턴스를 활용해 가져오는 방법
    // 모든 인스턴스는 Object를 상속받고 getClass 메서드를 사용 할 수 있습니다.
    Hello hello = new Hello();
    Class<? extends Hello> helloClass = hello.getClass();
    
    // 3. 직접 경로와 클래스명을 적어줘서 가져오는 방법
    // test.reflection 경로에 있는 Hello 클래스 정보를 가져옵니다.
    Class helloClass = Class.forName("test.reflection.Hello"); // 클래스 명은 당연히 맨 앞은 대문자

     

    리플렉션으로 메서드 가져오기

    Class<Hello> classHello = Hello.class;
    
    // 1. 선언된 전체 메소드 가져오기
    for(Method method : classHello.getDeclaredMethods()){
    	System.out.println(method); // 경로까지 전부 출력
        System.out.println(method.getName()); // 메서드명 만 출력
    }
    
    // 2. 특정 메서드 가져오기
    Method method = classHello.getMethod("메서드명");

     

    결론

    자바 리플렉션은 애플리케이션에서 유연성과 확장성을 높여주는 강력한 기술이지만 성능 저하, 보안 문제 등의 단점도 있으므로, 신중하게 사용해야 합니다.

    왜냐하면 리플렉션을 통해 런타임 시점에서 동적으로 코드를 조작할 수 있는 엄청난 장점이 있지만 리플렉션을 사용할 때는 성능과 보안, 안정성을 고려해야 하기 때문입니다.

     

    참고

    [1] - https://dong-woo.tistory.com/entry/Spring-JDK-%EB%8F%99%EC%A0%81-%ED%94%84%EB%A1%9D%EC%8B%9C%EC%99%80-CGLIB%EC%9D%98-%ED%95%9C%EA%B3%84