1. ํด๋์ค์ ๋งค๊ฐ๋ณ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์
public class MethodInfo {
public static void main(String[] args) throws Exception{
// 1. YoilTeller ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑ
// YoilTeller ํด๋์ค์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง ํด๋์ค ๊ฐ์ฒด ์์ฑ (Yoilteller ์ค๊ณ๋ ํ์ณ์ด)
Class clazz = Class.forName("com.fastcampus.ch2.YoilTellerMVC");
// ์ ๋ณด๋ค์ ์ด์ฉํด YoilTeller์ ๊ฐ์ฒด๋ฅผ ์์ฑ (์ค๊ณ๋ ์ฌ๋ณธ์ผ๋ก ๊ตฌํ)
Object obj = clazz.newInstance();
// 2. YoilTeller์ ๋ชจ๋ ๋งค์๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ๋ฐฐ์ด์ ์ ์ฅ
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 each๋ฌธ์ ์ด์ฉํด ๋งค๊ฐ๋ณ์์ ํ์
๊ณผ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ๊ฐ์ ธ์์ joiner์ ()์์ ๋ฃ๋๋ค.
// ์์ ํํ (int year, int month, ...)
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 , arg1 ์ด๋ฐ ์์ผ๋ก ๋ฌ๋ค.
์๋ํ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋งค๊ฐ ๋ณ์์ ํ์ ์ ์ค์ํ๊ฒ ์๊ฐํ์ง๋ง, ๋งค๊ฐ ๋ณ์์ ์ด๋ฆ์ ์ค์ํ๊ฒ ์๊ฐํ์ง ์์์ ์ ์ฅ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ปดํ์ผ๋ฌ๊ฐ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ๊น์ง ๊ธฐ์ตํ๋๋ก ๋ง๋ค๋ ค๋ฉด 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
(1) reflection API ์ด์ฉ
(2) Class File์ ์ง์ ์ฝ๋ ๋ฐฉ๋ฒ
(1) reflection API๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ java 1.8๋ถํฐ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ด๋ค.
Window > Preference > Java > Compiler > store information about method parameters ์ ํ
์ด๋๋ ์๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค
์ด๋ JRE System Library๊ฐ ์์ง๋ 1.8 ๋ฏธ๋ง ๋ฒ์ ผ์ด์ด์ ์ด๋ค.
์ด๋๋ pom.xml์ ๋ค์ด๊ฐ์ properties์ ์๋ฐ ๋ฒ์ ผ์ 1.8 ์ด์ ๋ฒ์ ผ์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
plugin์ apache.mave.plugins ๋ ๋๊ฐ์ด ๋ฒ์ ผ์ ๋ฐ๊ฟ์ค์ผํ๋ค.
์ด๋ ๋ฐ๊ฟ์ฃผ๋ ๋ฒ์ ผ์ ์์์ ๋ค์ด๊ฐ Compiler์ ๋ฒ์ ผ๊ณผ ๊ฐ์์ผ ํ๋ค.
(2) ํด๋์ค ํ์ผ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
window > show view > navigator
์ฌ๊ธฐ์ target์ ๋ค์ด๊ฐ๋ฉด ๋ชจ๋ ์๋ฐ ํด๋์ค ๋ง๋ค ๊ทธ ํด๋์ค์ ์ ๋ณด๊ฐ ์ ์ฅ๋ ํด๋์ค ํ์ผ์ด ์๋ค.
์ฌ๊ธฐ์ ์ํ๋ ๋งค์๋๊ฐ ๋ด๊ธด ํด๋์ค ํ์ผ์ ๊ฐ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ฝ์ด์ค๋ ๊ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ์์ง ์ด๋ ค์์ ์์ธํ ๋ฐฐ์ฐ์ง ์์๋ค.
2. MVC์ ์๋ฆฌ
class ModelController {
public String main(HashMap 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"));
//lineSeparator๋ ์ง๊ธ ์ฐ๊ณ ์๋ OS์ ๊ฐํ๋ฌธ์๋ฅผ ๋ํ๋ธ๋ค.
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 ์นํํ๋ค.
//.replace(A,B) A๋ฅผ B๋ก ๋ฐ๊พผ๋ค.
result = result.replace("${"+key+"}", (String)map.get(key));
}
// 4.๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
System.out.println(result);
}
}
3. ์ค์ค๋ก ํด๋ณด๊ธฐ
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 {
Class clazz = Class.forName("com.fastcampus.ch2.YoilTeller");
Object obj = clazz.newInstance();
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);
}
}
}
class ModelController {
public String main(HashMap 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 = "";
Scanner sc = new Scanner (new File(viewName + ".txt"));
while (sc.hasNextLine()) {
result += sc.nextLine() + System.lineSeparator();
}
Iterator it = map.keySet().iterator();
while(it.hasNext()) {
String key = (String)it.next();
result = result.replace("${"+key+"}", (String)map.get(key));
}
System.out.println(result);
}
}