프로젝트를 생성하면 패키지에 자동으로 생성됨.
원격프로그램으로 등록 방법
package com.fastcampus.ch2;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller //1. 원격 호출 가능한 프로그램으로 등록
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
//2. URL과 메서드 연결(맵핑, mapping)
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
}
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//1. 원격 호출가능한 프로그램으로 등록
@Controller
public class Hello {
//2. URL과 메서드를 연결
@RequestMapping("/hello")
/*
메서드가 static이던 아니던 상관없다
왜냐하면 톰캣에서 객체를 만들어 주기 때문에
but 당연히 static메서드는 iv사용 불가
따라서 인스턴스 메서드가 iv, cv 둘 다 사용 가능하므로 더 유용
*/
/*
* @RequestMapping으로
* 접근제어자 private, public 등
* 상관없이 외부에서 호출 가능
* 왜냐하면 Reflection API를 사용하기 때문
*/
private void main() {
System.out.println("Hello");
}
}
Reflection API를 통해 접근제어자가 private이라도 원격으로 접근 가능
Reflection API 사용법
package com.fastcampus.ch2;
import java.lang.reflect.Method;
public class PrivateMethodCall {
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객체가 가진 정보로 객체 생성
//main메서드를 밖에서 호출 할 수 있도록
Method main = helloClass.getDeclaredMethod("main"); // Method main으로 메서드를 참조
main.setAccessible(true); //private인 main()을 호출가능하게 한다.
main.invoke(hello); //main메서드 호출. hello.main()과 동일
}
}