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