About Constructor

http://olc.kr/mypage/course_list.jsp

Java Advanced Programming 2

Reflection이란?
실행시간에 메모리 구조를 활용하여 동적 제어를 하는 프로그래밍 할 때 사용.

장점 : 
무한한 확장성
동적 제어가 가능한 프로그래밍
객체들 간의 의존성이 없는 프로그래밍 
단점 
performance overhead 
security 제약 - 익셉션, 에러 (자바로는 바이러스를 만들 수 없다..) 
(oop의 관점 - 복잡성 증가는 어쩔수없음 얼마나 유연한 구조를 가지는가!)

동적로딩 - class.forName
클래스를 메모리상에 동적으로 로딩하는 방식
필요한 경우에 newInstance같은걸로 객체 생성 가능. 

https://docs.oracle.com/javase/7/docs/api/
Class라는 클래스로 무엇을 알 수 있을까?
java.lang.Class
public final class Class<T> 파이널이다 그래서 마음대로 오버라이딩이 안됨. 
생성자 정보
getDeclaredConstructor(Class<?>... parameterTypes) 선언되어있는 생성자 찾음 오버로딩을 위해 파라미터를 저렇게 받음. 
void도 클래스다. 
필드(property) 
메소드
상속관계 
subclass, assubclass
인터페이스
Annotation
	

//에러남 
public class CreateTest {
public static  void main(String args) /{
Class clazz = class.forName("testObj");
Object obj = clz.newInstance();
System.out.println(obj);
}
}

public class TestObj {
private String value;

public TestObj(String value) {
super();
this.value = value;
}

}


///에러안남. 인자 안받는거 넣었을 뿐인데?
public class CreateTest {
public static  void main(String args) /{
Class clazz = class.forName("testObj");
Object obj = clz.newInstance();
System.out.println(obj);
}
}

public class TestObj {
private String value;

   public TestObj(String value) {
super();
}

public TestObj(String value) {
super();
this.value = value;
}

}

그럼 생성자의 정체가 뭐냐?? 
어셈블리 코드를 보아요...
javap -verbose TestObj.class


디폴트 생성자가 필요한 이우 
파라미터가 잇으면 super()가 묵살된다. 
오브젝트를 만들 수 없다! 
class.forName은 바로 디폴트 생성자를 부르는데 기본생성자가 없어져 버리면 

생성자 : 객체를 만드는 방법을 제한한다. 

그런경우에 constructor를 뽑아내야한다. 
프레임워크에서 컨스트럭터를 넣어주는 이유는 컨스트럭터가 있으면 일반적으로 개체를 만들 수 없으니까! 


Constructor con = clz.getDeclaredConstructor(String.class);
this도 스테틱 variable이다. 
모든 객체는 어떤 클래스에 속하는지 메타 데이터를 가진다. static르로 super에 저장.

objectType -> generic 
Object obj = con.newInstance("AAA");

결론
사용자 저으이 생성자가 있는 경우 
classforname으로 init할수없다. 객체의 lifecycle이용해서 만들 수 없다 
그래서 constructor를 구해서 거기서 instance를 구해야 한다.






덧글

댓글 입력 영역