SSISO Community

시소당

자바 리플랙트 5 - Constructor클래스

Constructor클래스

 

Class클래스의 getConstructor메소드에 의해서 추출 가능한 클래스며, 대상 클래스의 하나의 생성자에 대한 정보와 액세스를 제공합니다. 본 클래스를 이용해서 인스턴스를 생성하는 것이 가능하게 됩니다.

보통 이 클래스를 추출해서 인스턴스를 생성할 경우는 기본 생성자(인자의 입력이 없는 기본 생성자 : 클래스명();)의 사용보다는 파라메터를 입력받는 생성자의 경우가 주를 이루고 있습니다. 기본생성자의 이용은 Class클래스의 newInstance메소드로도 가능하므로 이 클래스를 취득할 필요가 없기때문입니다.

그런고로 인스턴스를 생성할 경우 다음의 메소드를 사용하게 됩니다.

newInstance (Object [] initargs)

파라메터로 넘겨줘야 하는 내용은 Object배열로 생성해서 넣어주면 됩니다. 예제를 보도록 하겠습니다.

대상 클래스입니다. 기본생성자와 인자가 있는 생성자 둘을 가지고 있습니다.

 

상기와 같은 형태로 사용하게 됩니다.

 

instance1의 경우는 Class클래스를 사용해 인스턴스를 생성하는 방식이고,

instance2와 3의 경우는 Constructor클래스를 이용해서 인스턴스를 생성하는 방식입니다.

 

이중에서 눈여겨 볼 것은 instance3의 생성으로써, 대상 클래스의 int형 인자를 가지는 생성자 메소드는 private메소드로

정의 되어 있습니다.

private메소드는 클래스 내부에서만 사용할 수 있으므로, 본 생성자를 실행 시키는 것은 불가능한 일이라 볼 수 있겠으나, 여기서 리플랙트의 강점이 발생하게 되는데 이런 접근 권한을 풀 수가 있습니다.

접근권한에 대한 담당 클래스는 AccessibleObject클래스를 로써, AccessibleObject 클래스는, Field 오브젝트, Method 오브젝트, 및 Constructor 오브젝트의 base class입니다.

이 클래스를 사용하면 리플랙트 된 오브젝트의 사용시에, 디폴트의 Java 언어 액세스 제어 체크를 사용할지 중지할지를 설정 할 수 있습니다.

액세스 체크는 public, 디폴트 (package) 액세스, protected 및 private 멤버에 대해서 실행됩니다.

즉, 필드의 설정 또는 취득에 Field 가 사용되는 경우, 메소드의 호출에 Method 가 사용되는 경우, 혹은 클래스의 새로운 인스턴스의 생성 및 초기화에 Constructor 가 사용되는 경우입니다.

본 예제에서는 이러한 접근 권한을 풀기위해 setAccessible메소드를 이용하여 액세스가능 및 처리후 액세스 불가능으로 복원시키는 일을 하고 있습니다. 이 부분을 잘 이용하면, 이 또한 상당히 유연한 코딩이 가능해 지게 됩니다.

 

이상으로 Constructor클래스의 조사를 마치도록 하겠습니다. 본 클래스의 나머지 부분은 API를 참조하시면 되겠습니다.

709 view

4.0 stars