먼저 몇 가지 범주를 알아 보겠습니다.
클래스 (java.lang.class)
클래스 객체는 특별한 객체이며 각 클래스에는 해당 클래스의 "일반"객체를 만들 수있는 클래스 객체가 있습니다. 객체의 getClass () 메소드를 통해 얻을 수 있습니다.
예를 들어,이 코드 라인을 실행합니다.
코드 사본은 다음과 같습니다.
System.out.println ( "test".getClass (). toString ());
결과는 다음과 같습니다.
코드 사본은 다음과 같습니다.
클래스 java.lang.string
필드 (java.lang.reflect.field)
이 클래스는 필드를 나타내며 클래스에 액세스하는 데 사용할 수 있습니다.
다음으로 테스트 클래스를 만들어 봅시다 :
코드 사본은 다음과 같습니다.
클래스 북 {
공개 문자열 제목;
공개 int 길이 = 0;
public arraylist <페이지> pages = null;
@보수
공개 문자열 tostring () {
문자열 sb = "책 :/n";
sb+= "title ="+title+"/n";
sb + = "길이 =" + 길이 + "/n";
sb + = "pages =" + pages + "/n";
if (pages! = null) {
for (페이지 페이지 : 페이지) {
sb += page.toString ();
}
}
반환 sb.toString ();
}
}
수업 페이지 {
@보수
공개 문자열 tostring () {
"페이지/n"을 반환합니다.
}
}
위의 클래스를 테스트하려면 다음 방법을 호출하십시오.
코드 사본은 다음과 같습니다.
책 책 = 새 책 ();
System.out.println (책);
결과는 다음과 같습니다.
코드 사본은 다음과 같습니다.
책:
제목 = null
길이 = 0
pages = null
이것이 책 객체의 초기 상태입니다
우리는 반사 메커니즘을 사용하여 책 객체에서 길이 필드를 얻고 결과를 볼 수 있도록 수정합니다.
코드 사본은 다음과 같습니다.
책 책 = 새 책 ();
클래스 <?> aclass = book.getClass ();
필드 필드 = aclass.getfield ( "길이");
Field.setint (책, 9);
System.out.println (책);
실행중인 결과가 다음과 같습니다.
코드 사본은 다음과 같습니다.
책:
제목 = null
길이 = 9
pages = null
길이 필드의 값이 수정되었음을 알 수 있습니다.
위의 수정은 실제로 int 유형의 필드입니다.
코드 사본은 다음과 같습니다.
책 책 = 새 책 ();
클래스 <?> aclass = book.getClass ();
필드 [] fields = aclass.getfields ();
for (필드 필드 : 필드) {
field.setAccessible (true);
if (field.getType (). equals (string.class)) {
field.set (책, "Grimm 's Fairy Tale");
} else if (field.getType (). Equals (int.class)) {
Field.Set (Book, 199);
}
}
System.out.println (책);
위 코드의 출력 결과는 다음과 같습니다.
코드 사본은 다음과 같습니다.
책:
제목 = 그림의 동화
길이 = 199
pages = null
실제로, 문자열 유형의 모든 필드는 "Grimm 's Fairy Tale"으로 수정되며 Int 유형의 모든 필드는 199로 수정됩니다. 우리는이 분야가 무엇을 의미하는지조차 모릅니다.
다음으로 페이지 필드를 수정합니다. 이 필드는 Arraylist입니다.
코드 사본은 다음과 같습니다.
책 책 = 새 책 ();
클래스 <?> aclass = book.getClass ();
필드 [] fields = aclass.getfields ();
for (필드 필드 : 필드) {
field.setAccessible (true);
if (field.getType (). Equals (arrayList.class)) {
문자열 genric = field.getGenericType (). toString ();
문자열 genricclass = genric.substring (
genric.indexof ( '<') + 1,
genric.indexof ( '>'));
class <?> entityclass = class.forname (genricclass);
Object obj = entityclass.newinstance ();
ArrayList List = New ArrayList ();
list.add (obj);
field.set (책, 목록);
}
}
System.out.println (책);
출력 결과는 다음과 같습니다.
코드 사본은 다음과 같습니다.
책:
제목 = null
길이 = 0
pages = [페이지
]]
페이지
페이지 클래스를 직접 사용하지는 않았지만 여전히 페이지 객체를 만들었 음을 알 수 있습니다.
페이지 객체의 생성문은 문장에 있습니다 : entityclass.newinstance (). NewInstance 문은 클래스 객체의 중요한 방법 이며이 클래스의 해당 객체를 만드는 데 사용됩니다. 물론 클래스 생성자가 지원합니다. 또한 GengenericType 방법을 통해 필드의 유형 수정자를 얻을 수 있습니다. 여기에 넣으십시오. 이 문자열을 사용하면 페이지 클래스를로드하고 클래스 로더 클래스를 통해 페이지 객체를 만들 수 있습니다.