자바에서 제공하는 api 중에는 reflection api 가 있습니다.
이 reflection api는 동적으로 클래스에 관련된 정보를 가지고 올 수 있도록 도와줍니다.
replaction api 에는 Class 클래스와, Constructure, Method, Field 클래스등이 있습니다.
Class 클래스
1. 지정한 클래스의 정보를 가지고 오는 클래스입니다.
2. Class 클래스의 forClass(String className)와 Object 클래스의 getClass() 메소드로 Class를 만들수 있습니다.
ex)
1. Class cl = Class.forName("[[Ljava.lang.String;");
2. String str ="";
Class cl = str.getClass();
Constructure 클래스
1. 생성자 정보를 가지고 오는 클래스입니다.
2. 생성자를 가지고 있지 않습니다.
3. 따라서 Class 클래스의 getDeclaredConstructors(), getConstructors() 메소드를 사용하여 생성자 정보를 가지고 올 수 있습니다.
ex) Constructure[] constructure = cl.getDeclaredConstructors();
Method 클래스
1. 메소드 정보를 가지고 오는 클래스 입니다.
2. 생성자를 가지고 있지 않습니다.
3. 따라서 Class 클래스의 getMethod(), getDeclaredMethod() 메소드를 사용하여 생성자 정보를 가지고 올 수 있습니다.
4. getDeclaredMethods()의 경우 상속받은 메소드를 못가져 오는대신 private 메소드를 다 가져오는 것이 가능합니다.
5. getMethods()는 상속받은 메소드를 가져오는대신 private형의 메소드를 가지고 올 수 없습니다.
ex)
1. Mothod[] mothod = cl.getMethods();
2. Mothod[] mothod = cl.getDeclaredMethods();
Field 클래스
1. 메소드 정보를 가지고 오는 클래스 입니다.
2. 생성자를 가지고 있지 않습니다.
3. 따라서 Class 클래스의 getField(), getDeclaredField() 메소드를 사용하여 생성자 정보를 가지고 올 수 있습니다.
ex)
1. Field[] field = cl.getField();
2. Field[] field = cl.getDeclaredField();
source 보기
import java.lang.reflect.*;
public class ReflectTest
{
private StringBuffer reflect = new StringBuffer();
private Method[] methods = null;
private Field[] fields = null;
private Class class = null;
public ReflectTest(String classPath)
{
this.class = Class.forName(classPath);
}
public Class getClass()
{
reflect.append("className : "+this.class.getName()+" Modifier : "+Modifier.toString(this.class.getModifier()));
return this.class;
}
public void setMethods(Class cl)
{
this.methods = cl.getDeclaredMethod();
}
public Method[] getMethod()
{
Method method = null;
String methodName = "":
Class returnType = "";
int methodSize = method.length;
for(int idx=0;idx < methodSize;idx++)
{
method = this.methods[idx];
methodName = method.getName(); // 메소드명
returnType = method.getReturnType(); // 메소드 리턴타입
reflect.append("idx : "+idx+" methodName : "+methodName+" returnType : "+returnType.getName()+" Modifier : "+Modifier.toString(method.getModifiers())+" \n");
// method.getModifiers() : 메소드의 modifier (숫자로 나온다.)
// Modifier.toString(int modifiered) : 숫자로 나온 modifier를 문자로 바꿔준다.
public Class[] paramTypes = method.getParameterTypes(); // 메소드 파라메터
int paramLength = paramTypes.length;
for(int paramIdx = 0; paramIdx < paramLength; paramIdx++) {
if ( paramIdx> 0)
reflect.append(", ");
reflect.append(paramIdx+" paramType : "+paramTypes[paramIdx].getName());
if(paramIdx == paramLength-1)
reflect.append(" \n");
}
}
return this.methods;
}
public void setField(Class cl)
{
this.fields = cl.getDeclaredField();
}
public Field[] getField()
{
String fieldName = "";
String fieldType = "";
Field field = null;
int fieldSize = this.fields.length;
for(int idx = 0 ; idx < fieldSize; idx++)
{
field = fields[idx];
fieldName = field.getName();
fieldType = field.getType();
reflect.append("FieldName : "+fieldName+" FieldType : "+fieldType+" \n");
}
}
pubic String toString(){
return this.reflect.toString();
}
}
참고문서 : reflect tutorial