Java

[Java] Reflection

예은파파 2020. 11. 19. 23:46

 

Java Reflection 이란,

 

Reflection이란 객체를 통해 클래스의 정보를 분석해 내는 것을 말한다. ( 투명, 반사라는 사전적인 의미를 지니고 있다. )

객체의 메모리 정보만 알고 있고, 객체의 형에 대해서는 모른다는 가정하에 Reflection을 통해 아래와 같은 정보를 가져 올 수 있으며. 이 정보를 통해 객체를 생성하거나 메소드를 호출하거나 변수의 값을 변경 할 수 있다.

  • Class
  • Constructor
  • Method
  • Field
Class reflection = Data.class;

// Data class Method 정보
Method[] m = reflection.getMethods();
// Data class Field 정보
Field[] f = reflection.getFields();
// Data class 생성자 정보
Constructor[] cs = reflection.getConstructors();
// Data class Interface 정보
Class[] inter = reflection.getInterfaces();
// Data class 부모 클래스 정보
Class superClass = reflection.getSuperclass();

 

※ Class에 정의 된 Method 정보 조회

try {

	Class c = Class.forName("java.util.Stack");
	Method m[] = c.getDeclaredMethods();

	for (int i = 0; i < m.length; i++) { {

		Method m = methlist[i];
		System.out.println("name  = " + m.getName());
		System.out.println("decl class = " + m.getDeclaringClass());

		Class pvec[] = m.getParameterTypes();

		for (int j = 0; j < pvec.length; j++) {
        
			System.out.println(" param #" + j + " " + pvec[j]);      
			Class evec[] = m.getExceptionTypes();			

			for (int j = 0; j < evec.length; j++) {
				System.out.println("exc #" + j + " " + evec[j]);
			}
            
			System.out.println("return type = " + m.getReturnType());
			System.out.println("-----");		
		}
    }
    
} catch (Throwable e) {

	System.err.println(e);
}


 

※ Class의 Constructors 정보 조회

try {

	Class cls = Class.forName("java.util.Stack");
	Constructor ctorlist[] = cls.getDeclaredConstructors();

	for (int i = 0; i < ctorlist.length; i++) {

		Constructor ct = ctorlist[i];
		System.out.println("name = " + ct.getName());
		System.out.println("decl class = " + ct.getDeclaringClass());
		
        Class pvec[] = ct.getParameterTypes();

		for (int j = 0; j < pvec.length; j++)

			System.out.println("param #" + j + " " + pvec[j]);
		
        Class evec[] = ct.getExceptionTypes();
		for (int j = 0; j < evec.length; j++)

			System.out.println("exc #" + j + " " + evec[j]);
			System.out.println("-----");
		}

	}

} catch (Throwable e) {

	System.err.println(e);
}

 

※ Class의 Fields 정보 조회

try {

	Class cls = Class.forName("java.util.Stack");
	Field fieldlist[] = cls.getDeclaredFields();

	for (int i = 0; i < fieldlist.length; i++) {

		Field fld = fieldlist[i];

		System.out.println("name = " + fld.getName());
		System.out.println("decl class = " + fld.getDeclaringClass());
		System.out.println("type = " + fld.getType());

		int mod = fld.getModifiers();

		System.out.println("modifiers = " + Modifier.toString(mod));
		System.out.println("-----");

	}

} catch (Throwable e) {

	System.err.println(e);

}