Reflection API 사용 예시

태민·2022년 11월 22일
0

자바에서 제공하는 기본 API 중에 Reflection API 라는 것이 있다

이번에 처음 알게 되었는데 private이라고 해도 이 api를 사용해서

호출할 수 있다고 한다

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

//1. 원격 호출 가능한 프로그램으로 등록
@Controller
public class Hello { 
	int iv = 10; // 인스턴스 변수
	static int cv= 20; // static 변수

	// 2. URL과 메서드 연결
	@RequestMapping("/hello")
	private void main() {
		System.out.println("Hello- private this is test");
		System.out.println(cv); // OK
//		System.out.println(iv); // OK
	}
	public static void main2(){ // static 메서드 - cv만 사용가능
		System.out.println(cv); // OK

	}

}

이런 코드가 있다고 할 때

Main.java라는 파일을 하나 만들어서

package com.fastcampus.ch2;

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception{
//        Hello hello = new Hello();
//        hello.main(); // private이라서 외부 호출 불가

        // Reflection API를 사용 - 클래스 정보를 얻고 다를 수 있는 강력한 기능제공
        // java.lang.reflect패키지를 제공
        // Hello 클래스의 Class객체 (클래스의 정보를 담고 있는 객체) 를 얻어온다.
        Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
        Hello hello = (Hello)helloClass.newInstance(); // Class객체가 가진 정보로 객체 생성
        Method main = helloClass.getDeclaredMethod("main");
        main.setAccessible(true); // private인 main()을 호출가능하게 한다.

        main.invoke(hello); // hello.main()

    }
}

이렇게 Reflection API를 사용해서 hello.java에 있는 hello객체의 main 메서드를 호출해서

이렇게 호출된 값을 출력할 수 있다

지금당장 동작하는 원리를 전부 파악 할 수는 없지만

스프링프레임워크에서 자바의 Reflection API를 사용하는 경우가 많기 때문에

이런 것이 있구나 또 이렇게 private을 호출할 때 Reflection API를 사용하는구나

정도로 알고 넘어가면 좋을 것 같다

추후에 더 깊게 알게되면 포스팅을 주기적으로 업데이트할 생각이다

profile
몰입이 즐거운 개발자

0개의 댓글