Reflection 이란 ? 

안녕하세요. 율이맨입니다. 

Java Reflection 에 대해서 알아보려고 합니다.

사실 저는 Reflection 이 다소 생소하게 느껴졌습니다. 그래서 이렇게 알아보게 되었네요.

Reflection 이란 역으로 클래스를 불러서 클래스, 인터페이스, 필드 및 메소드를 구하는 방법으로

구체적인 클래스 정보를 알지 못해도 Reflection 을 이용하여 그 정보를 알아내어 사용할 수 있습니다.


Reflection 을 사용하기 위해서는 java.lang.reflect 을 import 하면 됩니다.

이 클래스를 사용하기 위한 세가지 스텝이 있습니다.


1. Class 객체를 얻어야 합니다.


Class c = Class.forName("java.lang.String");
Class c = int.class;
Class c = Integer.TYPE;


2. getDeclaredMethods 을 통해서 클래스에서 정의한 메소드리스트를 얻을 수 있습니다.


3. Reflection API 를 통해 정보를 핸들링 하면 됩니다.


MyClass myclass = new MyClass();
Class c = myclass.getClass();	
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
    System.out.println(m[i].toString());
위 예제는 메소드의 이름을 출력하게 됩니다.


그럼 이제 리플렉션을 이용해서 클래스의 메소드, 생성자, 필드를 찾아보겠습니다.

1. 클래스의 메소드 찾기

MyClass myclass = new MyClass();
Class c = myclass.getClass();		
Method methods[] = c.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
    System.out.println(methods[i].toString());
    System.out.println( "메소드 명= " + methods[i].getName());
    System.out.println( "정의된 클래스명 = " + methods[i].getDeclaringClass());		    	
}


2. 생성자명 찾기

MyClass myClass = new MyClass();
Class c = myClass.getClass();
Constructor ctrlist[] = c.getDeclaredConstructors();		    
for (int i = 0; i < ctrlist.length; i++) {
    System.out.println(ctrlist[i].toString());
    System.out.println( "생성자명 = " + ctrlist[i].getName());
    System.out.println( "정의된 클래스명 = " + ctrlist[i].getDeclaringClass());		    	
}	

3. 필드 찾기

MyClass myClass = new MyClass();
Class c = myClass.getClass();
Field  fieldlist[] = c.getDeclaredFields();		    
for (int i = 0; i < fieldlist.length; i++) {
    System.out.println(fieldlist[i].toString());
    System.out.println( "필드명 = " + fieldlist[i].getName());
    System.out.println( "필드타입 = " + fieldlist[i].getType());
    System.out.println( "정의된 클래스명 = " + fieldlist[i].getDeclaringClass());		    			 
}

그 외에도 getSuperclass(); getInterfaces();  등이 있습니다.

다음으로 메소드를 실행해보도록 하자 !
메소드 이름으로 특정 메소드를 실행할 수 있습니다. 
그리고 private 메소드를 실행 및 테스트 할 수 도 있습니다.

Integer resultInt = 0;
MyClass myClass = new MyClass();
Class c = myClass.getClass();	
			
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = c.getMethod("add", partypes);			
Object arglist[] = new Object[2];
arglist[0] = new Integer(20);
arglist[1] = new Integer(10);
Object retobj1 = meth.invoke(myClass, arglist);
resultInt = (Integer) retobj1;
System.out.println("public result :" +resultInt.intValue());
			
//private 접근 
Method prvMethod = myClass.getClass().getDeclaredMethod("minus", partypes);
prvMethod.setAccessible(true); //private 접근 가능 하도록 설정 !			
Object retobj2  = prvMethod.invoke(myClass, arglist);
resultInt = (Integer) retobj2;			
System.out.println("private result :" + resultInt.intValue());

사실 private 한 메소드 minus 는 다른 클래스에서는 접근이 불가능합니다. 
하지만 리플렉션의 setAccessible(true) 를 이용하면 가능합니다.

Tip : getMethod() 는 public 메소드를 불러오며, getDeclaredMethod() 는 
private 메소드를 포함한 클래스에 선언된 모든 메소드를 불러옵니다.


Reflection 을 이용하면오브젝트 생성과 필드 값 변경도 가능합니다.

Constructor.newInstance 를 이용하여 오브젝트를 생성하고 set필드를 이용하여 필드값 변경도 가능합니다.

이상 Java Reflection 에 대해 알아보았습니다.

도움이 되셨다면 공감을 눌러주세요.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기