이미 완성되어 컴파일까지 되어 배포된 프로그램에 대한 기능 확장을 위해서 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";
}
