Java의 Reflection을 이용한 API

이미 완성되어 컴파일까지 되어 배포된 프로그램에 대한 기능 확장을 위해서 Reflection API를 사용할 수 있습니다. 이 글은 이 목적을 위해 일단 필요한 코드를 정리한 글 입니다.

Java에서 어떤 타입에 대한 이름을 문자열로만 알고 있을 때, 그 타입의 인스턴스를 생성하기 위한 코드는 다음과 같습니다.

try {
	Class<?> clazz = Class.forName("tstConstructor.service.FirstService");
	//Class<?> clazz = tstConstructor.service.FirstService.class;
	
	Constructor<?> constructor = clazz.getConstructor(String.class);
	Serviceable instance = (Serviceable)constructor.newInstance("Jack");
	instance.run();
} catch (Exception e) {
	e.printStackTrace();
}	

위의 코드에서 FirstService 클래스의 코드는 다음과 같습니다.

package tstConstructor.service;

public class FirstService implements Serviceable {
	private String _name;
	
	public FirstService(String name) {
		this._name = name;
	}
	
	@Override
	public void run() {
		System.out.println("Hello, my name is " + this._name);
	}
}

또한 Serviceable 인터페이스의 코드는 다음과 같습니다.

package tstConstructor.service;

public interface Serviceable {
	void run();
}

또한 Java에서 어떤 타입에 대한 이름을 문자열로만 알고 있을 때, 그 타입의 정적 필드값을 얻기 위한 코드는 다음과 같습니다.

try {
	Class<?> clazz = Class.forName("tstConstructor.service.Gizmo");
	//Field field = Gizmo.class.getField("NAME");
	Field field = clazz.getField("NAME");
	Class<?> fieldType = field.getType();
	if(fieldType == String.class){
		System.out.println(field.get(null).toString());
	} else if(fieldType == double.class){
	    System.out.println(field.getDouble(null)); 
	}
} catch (Exception e) {
	e.printStackTrace();
}

Gizmo 클래스의 코드는 다음과 같습니다.

package tstConstructor.service;

public class Gizmo {
	public static String NAME = "GIZMO";
}

답글 남기기

이메일 주소는 공개되지 않습니다.