5/19

리무 rimu ·2023년 5월 22일

Web (jsp)

목록 보기
3/3

리플렉션 reflection

  • 반사라는 의미
  • 코드 만들 때 잘 사용하진 않음 (추천하지 않음)
package kr.ac.green;

import java.util.Hashtable;
import java.util.Properties;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import kr.ac.green.cmds.ICmd;
import kr.ac.green.cmds.ListCmd;

public class CmdFactory {
	private static Hashtable<String, ICmd> cmds = new Hashtable<String, ICmd>();
	
	public static void init(Properties prop) {
		try {
			Set<?> keys = prop.keySet();
		for(Object keyObj : keys) {
			String key = keyObj.toString();
			String className = prop.getProperty(key);
			
			// reflection 리플렉션 
			// 시스템처럼 안에서 동작하는 라이브러리에서 사용, 코드에서는 잘 사용안함
			// 객체 new 안하고도 만들 수 있는 방법, 풀 패키지명만 있으면 만들 수 있음
			// 이렇게하면 클래스 객체를 뽑아낼 수 있다
			// 기본 생성자로 만들어짐, 생성자를 선택할 수도 있음
			// Object라 형변환을 해야함
			// private한것도 다 쓸수 있고 불러낼 수 있음
//			Class klass = Class.forName(className);
			
			// 이 객체는 타입별로 하나만 있고
			// newListCmd 객체를 만든다고 할때 멤버변수만 힙에 올라가고
			// 클래스안에 있는 객체만 참고함
//			Class klass2 = ListCmd.class;
			
			ICmd cmdObj = (ICmd)Class.forName(className).newInstance();
			
			cmds.put(key, cmdObj);
		}	
			
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static void doAction(HttpServletRequest request, String cmd) {
		if(!cmds.containsKey(cmd)){
			cmd = "/null.book";
		}
		cmds.get(cmd).action(request);
	}
}

Void라는 클래스도 존재
자바는 전부다 객체지향적으로 되어있음

CmdFactory class를 만든 이유?

우리가 만들었던 메인서블릿, 커멘드 클래스의 의존성을 낮추려고 만든거임
찾기편하게 하기위해서도 만듬

if(cmd.equals(xxx)){
	cmdObj = new xxxCdm();
    }

따로따로 작업하지 않기 위해서 연관성을 끊고 일관성을 만들려고
interface를 만듬

ListCmd, UpdateCmd 가 바뀌면 MainServlet에도 바뀜
그래서 ICmd를 만듬 (결합도를 낮추려고)
브릿지 역할로 만들어준 클래스가 CmdFactory

profile
JAVA / SQL / Spring 을 공부하고 있습니다 🐥

0개의 댓글