자바에서 제공하는 기본 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를 사용하는구나
정도로 알고 넘어가면 좋을 것 같다
추후에 더 깊게 알게되면 포스팅을 주기적으로 업데이트할 생각이다