본문 바로가기

자바

리플렉션, Class 생성, Method 실행

자바의 리플렉션을 이용하면 클래스의 정보를 얻는 것외에도, 해당 정보를 통해 객체를 생성하거나 메소드를 실행시키는 행위 등을 할 수 있다.

 

객체 생성

자바는 new 연산자와 생성자를 통해 객체를 생성한다. 그러므로 먼저 생성자(Constructor)를 얻어와야 한다.

 

생성자 목록은 아래와 같이 얻을 수 있다.

Constructor[] constructors = testClass.getConstructors();

 

특정 생성자를 얻는 방법이다. 인자로 생성자의 파라미터를 전달해주면 된다. 가변 인자를 받고 있으므로 2개 이상일 경우 계속 나열해주면 된다. 아니면 배열로 전달해줘도 된다.

 

ex)

Constructor constructor = testClass.getConstructor(String.class); // 파라미터 1개

Constructor constructor = testClass.getConstructor(new Class[] {String.clsss, String.class, Integer.class}); // 파라미터 두개

 

(인자로 전달한 파라미터에 맞는 생성자가 없으면 NoSuchMethodException이 발생한다.

 

Constructor 클래스의 newInstance(Object...initargs)를 사용하면된다.

 

그럼 User 클래스를 리플렉션을 이용해서 생성해보겠다.

 

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Main01 {

	public static void main(String[] args) throws NoSuchMethodException {
		
		Class userClass = UserDto.class;
		
		Constructor cs = userClass.getConstructor(new Class[] {String.class, String.class, String.class, Integer.class});
		
		try {
			UserDto userDto = (UserDto)cs.newInstance("alpha", "beta", "gamma", 99);
			System.out.println(userDto.toString());
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

결과

 

UserDto [id=alpha, pwd=beta, name=gamma, birthDate=99]

 

newInstance의 반환형이 Object라 캐스팅이 필요하다.

 

또한 newInstance시에 인자의 개수가 위에서 얻어온 Constructor의 파라미터 개수와 맞지 않을 경우

 

IllegalArgumentException이 발생한다.

 

 

 

 

 

출처:

joont.tistory.com/167

'자바' 카테고리의 다른 글

비트 연산  (0) 2020.11.21
문자열 붙이기  (0) 2020.11.18
날짜 포맷 설정(SimpleDateFormat)  (0) 2020.11.16
스프링 컨테이너  (0) 2020.11.15
MessageFormat  (0) 2020.11.15