* 정의
- 객체를 통해 클래스의 정보를 분석해 내는 기법
- 지금 실행중인 프로그램에서 사용하는 객체를 비춰줌.
지금 내가 사용하는 객체의 정보 가져오기, 객체의 매소드 호출등의 작업을 할 수 있게 해줌
– Class클래스 사용.
– 클래스 객체의 형확인: instanceof
* 사용법
ex) 외부 Data객체를 가정하에…..
해당 객체의 정보는 배열형태로 리턴됨.(한 객체는 여러개의 정보를 포함하기 때문…)
1. Data객체 클래스의 메서드 알아내기
Class c = Data.class;
Method[] m = c.getMethods();
2. Data객체 클래스의 필드 알아내기
Class c = Data.class;
Field[] f = c.getFields();
3. Data객체 클래스의 생성자 알아내기
Class c = Data.class;
Constructor[] cs = c.getConstructors();
4. Data객체 클래스의 인터페이스, 상위클래스 알아내기
Class c = Data.class;
Class[] iface = c.getInterfaces();
Class sc = c.getSuperclass();
- 예)
- import java.lang.reflect.*;
- public class Exam_Reflection {
- public Exam_Reflection(Object object) {
- // 클래스 기본 정보 확인
- System.out.println(“** Class information **”);
- System.out.println(“=======================”);
- System.out.println(object.getClass().getPackage());
- System.out.println(“Class Name : ” + object.getClass().getName());
- System.out.println(“Super Class: ” + object.getClass().getSuperclass().getName());
- System.out.println(“”);
- // 접근자 확인
- System.out.println(“** Class Modifier information **”);
- System.out.println(“================================”);
- System.out.println(“Modifier : “+Modifier.toString(object.getClass().getModifiers()));
- System.out.println(“”);
- // 메소드 확인
- System.out.println(“** Method information **”);
- System.out.println(“========================”);
- System.out.println(” << all method >> “);
- System.out.println(getMethodInfo(object.getClass().getDeclaredMethods()));
- System.out.println(“”);
- System.out.println(” << access possible method >> “);
- System.out.println(getMethodInfo(object.getClass().getMethods()));
- System.out.println(“”);
- // 필드 확인
- System.out.println(“** Field information **”);
- System.out.println(“=======================”);
- System.out.println(” << all field >> “);
- System.out.println(getFieldInfo(object.getClass().getDeclaredFields()));
- System.out.println(” << access possible field >> “);
- System.out.println(getFieldInfo(object.getClass().getFields()));
- System.out.println(“”);
- }
- private String getFieldInfo(Field[] fields) {
- StringBuffer fieldInfo = new StringBuffer();
- for (int i=0; i<fields.length;i++) {
- StringBuffer info = new StringBuffer();
- info.append(Modifier.toString(fields[i].getModifiers()) +” “);
- info.append(fields[i].getType().getName() + ” “);
- info.append(fields[i].getName() + ” \n”);
- fieldInfo.append(info.toString());
- }
- return fieldInfo.toString();
- }
- private String getMethodInfo(Method[] methods) {
- StringBuffer methodInfo = new StringBuffer();
- for (int i=0; i<methods.length;i++) {
- StringBuffer info = new StringBuffer();
- String methodName = methods[i].getName();
- int methodModifier = methods[i].getModifiers();
- Class methodReturnType = methods[i].getReturnType();
- Class[] methodParamType = methods[i].getParameterTypes();
- info.append(Modifier.toString(methodModifier) +” “);
- info.append(methodReturnType.getName() +” “);
- info.append(methodName + “(“);
- for (int j=0;j<methodParamType.length;j++) {
- if (j != 0) info.append(“, “);
- info.append(methodParamType[j].getName());
- }
- info.append(“)\n”);
- methodInfo.append(info.toString());
- }
- return methodInfo.toString();
- }
- private String getModifierInfo(Object object) {
- StringBuffer modifier = new StringBuffer(“Modifier :”);
- int modifierType = object.getClass().getModifiers();
- if (Modifier.isAbstract(modifierType)) modifier.append(” ABSTRACT”);
- if (Modifier.isFinal(modifierType)) modifier.append(” FINAL”);
- if (Modifier.isInterface(modifierType)) modifier.append(” INTERFACE”);
- if (Modifier.isNative(modifierType)) modifier.append(” NATIVE”);
- if (Modifier.isPrivate(modifierType)) modifier.append(” PRIVATE”);
- if (Modifier.isProtected(modifierType)) modifier.append(” PROTECTED”);
- if (Modifier.isPublic(modifierType)) modifier.append(” PUBLIC”);
- if (Modifier.isStatic(modifierType)) modifier.append(” STATIC”);
- if (Modifier.isSynchronized(modifierType)) modifier.append(” SYNCHRONIZED”);
- if (Modifier.isStrict(modifierType)) modifier.append(” STRICT”);
- if (Modifier.isVolatile(modifierType)) modifier.append(” VOLATILE”);
- return modifier.toString();
- }
- public static void main(String ar[]) {
- new Exam_Reflection(new String());
- }
- }