1. Reflection 이란?
String값으로 컴파일 된 자바의 class, field, method에 대한 정보를 제공하고,
field값의 변경 및 method의 실행(invoke)을 가능하게 하는것
(Glen McCluskey 1988 reflection은 자바언어의 특징이다. 라고함)

2. Invoke하는 예제와 Modifier의 보안문제
package Invoke;
import java.lang.reflect.Method;
public class TestInvoke {
 public String display(){
  return "in display";
 }
 private String privateMethod(){
  return "in privateMethod";
 }
 public static void main(String[] args) {
  try{
   // Invoke하는 예
   Class c = Class.forName("Invoke.TestInvoke");
   Class partypes[] = new Class[0];
   Method m = c.getMethod("display", partypes);
   Object o = m.invoke(c.newInstance(), null);
   String sResult = o.toString();
   System.out.println("Result :" + sResult);
   
   // Modifier의 보안문제
   Class c2 = Class.forName("Invoke.TestInvoke");
   Class partypes2[] = new Class[0];
   Method m2 = c2.getDeclaredMethod("privateMethod", partypes2);
   Object o2 = m2.invoke(c2.newInstance(), null);
   String sResult2 = o2.toString();
   System.out.println("Result2 :" + sResult2);
  }catch(Exception e){
   System.out.println(e);
  }
 }
}


*. 여러가지 사용예
Class cls = Class.forName("constructor1");

###### is Instance
cls.isInstance()

###### method info
Method methlist[] = cls.getDeclaredMethods();
Method m = methlist[0];
Class pvec[] = m.getParameterTypes();
Class evec[] = m.getExceptionTypes();
m.getReturnType());

###### constructor
Constructor ctorlist[] = cls.getDeclaredConstructors();

###### field
Field fieldlist[] = cls.getDeclaredFields();
Field fld = fieldlist[0];
fld.getName()
fld.getDeclaringClass()
fld.getType()
fld.getModifiers()

###### create object
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct = cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);

###### array
Class cls = Class.forName("java.lang.String");
Object arr = Array.newInstance(cls, 10);
Array.set(arr, 5, "this is a test");
String s = (String)Array.get(arr, 5);
System.out.println(s);

###### 적용예
eclipse의 자동완성기능으로 메소드명 찾아주기
spring의 Dependency Injection
spring의 AOP(Proxy Pattern)


참조 URL : http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html




Posted by 파이팅야
,