관리 메뉴

거니의 velog

(22) 토요일 수업 5 본문

대덕인재개발원_final project

(22) 토요일 수업 5

Unlimited00 2024. 2. 3. 09:51

https://dokumen.pub/

 

Digitale Bibliothek Erkenntnisse finden und austauschen. - DOKUMEN.PUB

Wir bieten Ihnen benutzerfreundliche und kostenlose Tools zur Veröffentlichung und Austausch von Daten.

dokumen.pub


package ddit.chap13.test02;

// 클래스 객체 생성시 처리 순서?

// static 멤버 변수(전역 변수) -- 왜 쓰지?
// static 블럭 -- 왜 쓰지?
// 멤버 변수(전역변수) -- 왜 쓰지?
// 블럭 -- 왜 쓰지?
// 생성자 함수 -- 왜 쓰지?

// 객체 1번 호출 이후 순서

// 멤버 변수(전역변수)
// 블럭
// 생성자 함수

public class TestVO {

	// 멤버 변수
	private String testId;
	private String testName;
	
	// static 변수
	private static String data = "test";
	
	static {
		System.out.println("static 초기화 block 영역 호출");
	}
	
	{
		System.out.println("초기화 block 영역 호출");
	}
	
	// 생성자
	public TestVO () {}
	
	public TestVO (String testId, String testName) {
		this.testId = testId;
		this.testName = testName;
	}
	
	public void test() {
		System.out.println("테스트 함수 호출");
	}
	
	@Deprecated
	public void test2() {
		System.out.println("테스트 함수2 : Deprecated 호출");
	}

	@Override
	public String toString() {
		return "TestVO [testId=" + testId + ", testName=" + testName + "]";
	}

	public String getTestId() {
		return testId;
	}

	public void setTestId(String testId) {
		this.testId = testId;
	}

	public String getTestName() {
		return testName;
	}

	public void setTestName(String testName) {
		this.testName = testName;
	}

	public static String getData() {
		return data;
	}

	public static void setData(String data) {
		TestVO.data = data;
	}
	
}
package ddit.chap13.test02;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test01 {

	public static void main(String[] args) {
		// 리플렉션
		// 텍스트를 자바 객체로 호출
		// Member --> new MemberVO()
		// 시스템을 동적으로 호출하고 싶을 때...
		// 결제 모듈에 로직이 들어가면 안 된다. 모듈은 결제만 해야지 추가 로직이 들어가면 안 됨.
		// 이를 처리하기 위함.
		
		// 클래스명 : TestVo -> ddit.chap13.test02.TestVO
		// String -> Class
		// String -> Class -> Object(new TestVO())
		// String -> Class -> Constructor -> Object(new TestVO("a001", "김은대"))
		// String -> Class -> Method -> 호출 invoke (test())
		// String -> Class -> Field -> 멤버 변수 접근
		
		try {
			// 1. 클래스 객체 생성
			Class<?> forName = Class.forName("ddit.chap13.test02.TestVO");
			System.out.println(forName);
			
			// 2. 객체 생성 : new MemberVO()
			Object newInstance = forName.newInstance(); // testVO 객체
			TestVO vo = (TestVO) newInstance;
			vo.setTestId("a001");
			System.out.println(vo);
			
			// String -> Class -> Object(new TestVO())
			Constructor<?> const1 = forName.getDeclaredConstructor();
			Object obj1 = const1.newInstance();
			
			// String -> Class -> Constructor -> Object : new TestVO("a001", "김은대")
			Constructor<?> const2 = forName.getDeclaredConstructor(String.class, String.class);
			Object obj2 = const2.newInstance("a001", "김은대"); // 김은대
			TestVO test2 = (TestVO) obj2;
			System.out.println("test2 testName : " + test2.getTestName());
			System.out.println("obj2 : " + obj2);
			
			// Field : testName 변경
			// String -> Class -> Field -> 내가 정의한 생성자 함수에 접근
			Field[] getDeclaredFields = forName.getDeclaredFields();
			for (Field f : getDeclaredFields) {
				System.out.println("필드명 = " + f.getName());
			}
			
			Field field1 = forName.getDeclaredField("testName");
			String name = field1.getName();
			field1.setAccessible(true);
			Object object = field1.get(obj2); // 객체.필드 --> 필드.get(객체)
			System.out.println("reflection test2 testName : " + object);
			
			// Field 값 변경
			// test2.setTestName("김은순") -> field.set(객체, 값)
			field1.set(obj2, "김은순"); 
			System.out.println(obj2);
			
			// Method
			// test.setTestName("김은오") -> method.invoke(객체, 값)
			// String -> Class -> Method -> 호출()
			Method method = forName.getDeclaredMethod("setTestName", String.class);
			method.invoke(obj2, "김은오"); // test.setTestName("김은오")
			System.out.println(obj2);
			
			// 스프링 어노테이션 제작 방법
			{
				Method method2 = forName.getDeclaredMethod("setTestName", String.class);
				method2.invoke(obj2, "김은일"); // test.setTestName("김은일")
				System.out.println(obj2);
			}
			{
				Method method3 = forName.getDeclaredMethod("test2"); // test()
				method3.invoke(obj2); // test.setTestName("김은일")
				
				Deprecated anno = method3.getDeclaredAnnotation(Deprecated.class);
				System.out.println(anno);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


package ddit.chap13.test02;

import java.util.HashMap;
import java.util.Map;

public class ApplicationContext {

	private static Map<String, Object> context = new HashMap<String, Object>();
	
	public static <T> T getBean(String beanName, Class<T> clazz) {
		return (T) context.get(beanName);
	}
	
	public static void addBean(Object obj) {
		context.put(obj.getClass().getSimpleName(), obj);
	}
	
}
package ddit.chap13.test02;

public class MainClass {

	public static void main(String[] args) {
		
		// 최초 객체를 생성하여 ApplicationContext 에 담는다.
		TestVO v = new TestVO("a001", "김은대");
		ApplicationContext.addBean(v);
		
		// @Autowired
		// ApplicationContext context;
		
		// 함수내부
		// context.getBean("휴가 서비스 클래스")
		// obj.invoke(); -> 서비스 함수 호출
		TestVO bean = ApplicationContext.getBean("TestVO", TestVO.class);
		System.out.println(bean);
		
	}
	
}


 

'대덕인재개발원_final project' 카테고리의 다른 글

(24) CICD  (0) 2024.02.19
(23) 리눅스  (0) 2024.02.13
(21) 웹 소켓 세팅  (1) 2024.02.01
(20) 토요일 수업 4  (0) 2024.01.13
(19) 보강 12  (0) 2024.01.08