실행 중인 프로그램 내부에서 자바 타입들에 대해 알아내기 위해 자바 reflection 패키지를 사용할 수 잇다.
예를 들면, 특정 클래스의 모든 메소드 명의 목록을 수할 수도 있고, 그것을 보여줄 수도 있다.
혹은 특정 메소드를 나타내는 java.lang.reflect.Method 객체를 가질 수도 있고, 그 객체를 메소드에 대한 일종의 포인터 처럼 사용할 수도 있다.
컴파일시 사용 하는 것이 아니라 런 타임에 필요한 클래스의 메소드를 찾아서 사용할 수 있다.
형식 1.
import java.lang.reflect.*;
public class NewObjectTest2{
public static void main(String[] arg)
throws ClassNotFoundException, InstantiationException, IllegalAccessException
,NoSuchMethodException, InvocationTargetException
{
Class c = String.class;
Class[] argType = new Class[]{String.class};
Constructor con = c.getConstructor(argType);
Object[] initArg = new Object[]{"Hello World"};
Object obj = con.newInstance(initArg);
if(obj instanceof String){
System.out.println("String형이 맞습니다.:" + obj);
} else {
System.out.println("Vector형이 아닙니다.");
}
}
}
java.lang.String 클래스의 생성자 리플렉션 예제 입니다.
Class c = String.class; // String 클래스를 클래스 타입으로 케스팅한 것입니다.
참고로, 자바의 모든 객체는 Class 입니다. (프리미티브 타입도 마찬가지 입니다)
그러니까 Class 를 통해 리플렉션을 할 수 있는 것이겠죠...
Class[] argType = new Class[]{String.class};
String 클래스를 클래스 베열에 등록 합니다.
현재는 리플렉션 대상이 String 클래스 하나이지만, 여러 개의 클래스를 동시에 리플렉션 할수도 있겠죠
그래서 배열로 Class를 선언한 것입니다.
Constructor con = c.getConstructor(argType);
클래스배열 argType 에서 생성자들만 잡아옵니다.
String 클래스는 인자가 없는것과, 인자가 있는것 두가지의 생성자가 존재합니다. 그쵸?
new String(); 과 new String("인자있음"); 이 그것입니다.
이것이 메서드 오버로딩 이라고 다들 알고 있을 겁니다.
Object[] initArg = new Object[]{"Hello World"};
파라미터를 설정하고 있습니다.
클래스를 리플렉션을 통해 생성자로 클래스를 인스턴스화 할때
메서드(생성자) 오브로딩을 통해 인스턴스화 하려고 파라미터를 설정하고 있습니다.
이건 new String("인자있음"); 에서 initArg 이 "인자있음" 이 되는 것입니다.
리플렉션을 통해서 아규먼트를 세팅할경우에 이처럼 Class[] 배열로 설정하게 됩니다.
아규먼트는 여러타입의 여러 인자가 올수 있기때문입니다.
Object obj = con.newInstance(initArg);
최종적으로 String 클래스가 인스턴스화 되었습니다.
이코드는 new String("인자있음"); 과 동일합니다.
// 인스턴스 객체의 비교
if(obj instanceof String){
System.out.println("String형이 맞습니다.:" + obj);
}
else {
System.out.println("String 형이 아닙니다."); // 여기 오타나셨네요
}
참고하시기 바랍니다.
출처 : 나, http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=65205977&qb=7J6Q67CUIOumrO2UjOugieyFmA==&enc=utf8§ion=kin&rank=3&sort=0&spq=1&pid=gtlHQB331xlssbgIl4Nssv--045286&sid=TBgU4jgGGEwAADFKD7A
간단 소스
import java.lang.reflect.*;
public class field1 {
private double d;
public static final int i = 37;
String s = "testing";
public static void main(String args[])
{
try {
Class cls = Class.forName("field1"); // field 클래스 로딩
// 로딩한 클래스내 필드 목록 출력
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);
}
}
}
'Java' 카테고리의 다른 글
[Java] Java Property(ClassLoader) (0) | 2010.06.17 |
---|---|
[Java] Java Property(위치 지정) (0) | 2010.06.17 |
[Java] 오버로딩, 오버라이딩 (0) | 2010.06.16 |
[Java] 자료구조!! (0) | 2010.06.03 |
[Java] 자바 소스코드 많은 추천 싸이트!!! (0) | 2010.06.03 |