화요일, 4월 30
Shadow

#063 리플렉션(reflection)

* 정의

  • 객체를 통해 클래스의 정보를 분석해 내는 기법
  • 지금 실행중인 프로그램에서 사용하는 객체를 비춰줌.

    지금 내가 사용하는 객체의 정보 가져오기, 객체의 매소드 호출등의 작업을 할 수 있게 해줌

– 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();

  •  객체 정보 가져 오기
  1. 예)
  2.  import java.lang.reflect.*;
  3. public class Exam_Reflection {
  4.     public Exam_Reflection(Object object) {
  5.         // 클래스 기본 정보 확인
  6.         System.out.println(“** Class information **”);
  7.         System.out.println(“=======================”);
  8.         System.out.println(object.getClass().getPackage());
  9.         System.out.println(“Class Name : ” + object.getClass().getName());
  10.         System.out.println(“Super Class: ” + object.getClass().getSuperclass().getName());
  11.         System.out.println(“”);
  12.         // 접근자 확인
  13.         System.out.println(“** Class Modifier information **”);
  14.         System.out.println(“================================”);
  15.         System.out.println(“Modifier : “+Modifier.toString(object.getClass().getModifiers()));
  16.         System.out.println(“”);
  17.         // 메소드 확인
  18.         System.out.println(“** Method information **”);
  19.         System.out.println(“========================”);
  20.         System.out.println(” << all method >> “);
  21.         System.out.println(getMethodInfo(object.getClass().getDeclaredMethods()));
  22.         System.out.println(“”);
  23.         System.out.println(” << access possible method >> “);
  24.         System.out.println(getMethodInfo(object.getClass().getMethods()));
  25.         System.out.println(“”);
  26.         // 필드 확인
  27.         System.out.println(“** Field information **”);
  28.         System.out.println(“=======================”);
  29.         System.out.println(” << all field >> “);
  30.         System.out.println(getFieldInfo(object.getClass().getDeclaredFields()));
  31.         System.out.println(” << access possible field >> “);
  32.         System.out.println(getFieldInfo(object.getClass().getFields()));
  33.         System.out.println(“”);
  34.     }
  35.     private String getFieldInfo(Field[] fields) {
  36.         StringBuffer fieldInfo = new StringBuffer();
  37.         for (int i=0; i<fields.length;i++) {
  38.             StringBuffer info = new StringBuffer();
  39.             info.append(Modifier.toString(fields[i].getModifiers()) +” “);
  40.             info.append(fields[i].getType().getName() + ” “);
  41.             info.append(fields[i].getName() + ” \n”);
  42.             fieldInfo.append(info.toString());
  43.         }
  44.         return fieldInfo.toString();
  45.     }
  46.     private String getMethodInfo(Method[] methods) {
  47.         StringBuffer methodInfo = new StringBuffer();
  48.         for (int i=0; i<methods.length;i++) {
  49.             StringBuffer info = new StringBuffer();
  50.             String methodName = methods[i].getName();
  51.             int methodModifier = methods[i].getModifiers();
  52.             Class methodReturnType = methods[i].getReturnType();
  53.             Class[] methodParamType = methods[i].getParameterTypes();
  54.             info.append(Modifier.toString(methodModifier) +” “);
  55.             info.append(methodReturnType.getName() +” “);
  56.             info.append(methodName + “(“);
  57.             for (int j=0;j<methodParamType.length;j++) {
  58.                 if (j != 0) info.append(“, “);
  59.                 info.append(methodParamType[j].getName());
  60.             }
  61.             info.append(“)\n”);
  62.             methodInfo.append(info.toString());
  63.         }
  64.         return methodInfo.toString();
  65.     }
  66.     private String getModifierInfo(Object object) {
  67.         StringBuffer modifier = new StringBuffer(“Modifier :”);
  68.         int modifierType = object.getClass().getModifiers();
  69.         if (Modifier.isAbstract(modifierType))      modifier.append(” ABSTRACT”);
  70.         if (Modifier.isFinal(modifierType))         modifier.append(” FINAL”);
  71.         if (Modifier.isInterface(modifierType))     modifier.append(” INTERFACE”);
  72.         if (Modifier.isNative(modifierType))        modifier.append(” NATIVE”);
  73.         if (Modifier.isPrivate(modifierType))       modifier.append(” PRIVATE”);
  74.         if (Modifier.isProtected(modifierType))     modifier.append(” PROTECTED”);
  75.         if (Modifier.isPublic(modifierType))        modifier.append(” PUBLIC”);
  76.         if (Modifier.isStatic(modifierType))        modifier.append(” STATIC”);
  77.         if (Modifier.isSynchronized(modifierType))  modifier.append(” SYNCHRONIZED”);
  78.         if (Modifier.isStrict(modifierType))        modifier.append(” STRICT”);
  79.         if (Modifier.isVolatile(modifierType))      modifier.append(” VOLATILE”);
  80.         return modifier.toString();
  81.     }
  82.     public static void main(String ar[]) {
  83.         new Exam_Reflection(new String());
  84.     }
  85. }

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.