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 에 대해 알아보았습니다.
도움이 되셨다면 공감♥을 눌러주세요.