package com.fastcampus.ch2;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.StringJoiner;

public class MethodInfo {
	public static void main(String[] args) throws Exception{

		// 1. YoilTeller 클래스의 객체를 생성
		Class clazz = Class.forName("com.fastcampus.ch2.YoilTeller");
		Object obj = clazz.newInstance();
		
		// 2. 모든 메서드 정보를 가져와서 배열에 저장
		Method[] methodArr = clazz.getDeclaredMethods();
		
		for(Method m : methodArr) {
			String name = m.getName(); // 메서드의 이름
			Parameter[] paramArr = m.getParameters(); // 매개변수 목록
//			Class[] paramTypeArr = m.getParameterTypes(); // 반환 타입
			Class returnType = m.getReturnType();
			
			StringJoiner paramList = new StringJoiner(", ", "(", ")"); // 구분자, 접두사, 접미사
			
			for(Parameter param : paramArr) {
				String paramName = param.getName();
				Class  paramType = param.getType();
				
				paramList.add(paramType.getName() + " " + paramName);
			}
			
			System.out.printf("%s %s%s%n", returnType.getName(), name, paramList);
		}
	} // main
}

 

 

 

 

 

매개변수의 이름을 저장하지 않아서 arg0으로 출력됌

 

메서드의 매개변수 이름이 필요하기 때문에 컴파일러 옵션에 parameters를 준다.(매개변수 이름을 저장)

JDK 1.8부터 추가되었다.

 

Window - Preferences

 

 

다시 실행해도 파라미터가 나오지 않는 것은 1.6버전이기 때문이다.

 

자바의 버전을 변경하기 위해 pom.xml 로 들어가서 수정

버전 복사

 

아래로 내려서 plugin도 변경해준다.

${java-version} 대신에 직접 11버전이면 11을 입력해줘도 되지만 위에 프로퍼티에 버전이 언제든지 바뀌면

따로 수정하지 않아도 되므로 문자열로 이렇게 받도록 수정해주는 것이다.

 

 

메이븐을 사용중이므로 업데이트 프로젝트를 해주어야 한다.

 

 

재실행을 해보면 이제 매개변수의 이름이 출력되었다.

 

 

Window - Show View - Other

탐색기라고 생각하면 된다.

 

이번엔 YolilTellerMVC이 매개변수를 출력해보았다.

 

메서드의 진행 방향과 인스턴스의 생성과정

 

다른 예제를 가져왔다.

 

package com.fastcampus.ch2;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

class ModelController {
	public String main(HashMap map) {
		// 작업 결과를 map에 저장
		map.put("id", "asdf");
		map.put("pwd", "1111");
		
		return "txtView2"; // 뷰이름을 반환
	}
}

public class MethodCall {
	public static void main(String[] args) throws Exception{
		HashMap map = new HashMap();
		System.out.println("before:"+map);

		ModelController mc = new ModelController();
		String viewName = mc.main(map);
		
		System.out.println("after :"+map);
		
		render(map, viewName);
	}
	
	static void render(HashMap map, String viewName) throws IOException {
		String result = "";
		
		// 1. 뷰의 내용을 한줄씩 읽어서 하나의 문자열로 만든다.
		Scanner sc = new Scanner(new File(viewName+".txt"));
		
		while(sc.hasNextLine())
			result += sc.nextLine()+ System.lineSeparator();
		
		// 2. map에 담긴 key를 하나씩 읽어서 template의 ${key}를 value바꾼다.
		Iterator it = map.keySet().iterator();
		
		while(it.hasNext()) {
			String key = (String)it.next();

			// 3. replace()로 key를 value 치환한다.
			result = result.replace("${"+key+"}", (String)map.get(key));
		}
		
		// 4.렌더링 결과를 출력한다.
		System.out.println(result);
	}
}

 

 

실행을 해봤는 txtView2.txt 가 없어서 에러가 났다.

 

ch2우 클릭후 new - file

 

viewTxt1.txt

 

viewTxt2.txt

 

다시 MethodCall을 실행

현재 view2를 출력하여서 이렇게 출력된 것이고 view1로 바꾼다면 이렇게 출력된다.

+ Recent posts