まず、いくつかのカテゴリを知りましょう。
クラス(java.lang.class)
クラスオブジェクトは特別なオブジェクトであり、各クラスにはクラスオブジェクトがあり、そのクラスの「通常の」オブジェクトを作成します。オブジェクトのgetClass()メソッドを介して取得できます。
たとえば、このコード行を実行します。
コードコピーは次のとおりです。
System.out.println( "test" .getClass()。toString());
結果は次のとおりです。
コードコピーは次のとおりです。
クラスJava.lang.String
フィールド(java.lang.reflect.field)
このクラスはフィールドを表し、クラスへのアクセスに使用できます
次に、テストクラスを作成しましょう。
コードコピーは次のとおりです。
クラスブック{
パブリックストリングタイトル。
public int length = 0;
public arrayList <age>ページ= null;
@オーバーライド
public string toString(){
文字列sb = "book:/n";
sb+= "title ="+title+"/n";
sb + = "length =" + length + "/n";
sb + = "pages =" + pages + "/n";
if(pages!= null){
for(ページ:ページ){
sb += page.toString();
}
}
return sb.tostring();
}
}
クラスページ{
@オーバーライド
public string toString(){
"page/n"を返します。
}
}
上記のクラスをテストするには、次の方法に電話してください。
コードコピーは次のとおりです。
book book = new book();
System.out.println(book);
その結果はこれです:
コードコピーは次のとおりです。
本:
タイトル= null
長さ= 0
ページ= null
これは、本オブジェクトの初期状態です
反射メカニズムを使用して、本オブジェクトの長さフィールドを取得し、それを変更して結果を表示します。
コードコピーは次のとおりです。
book book = new book();
class <?> aclass = book.getClass();
フィールドフィールド= aclass.getfield( "length");
field.setint(book、9);
System.out.println(book);
実行中の結果は次のとおりです。
コードコピーは次のとおりです。
本:
タイトル= null
長さ= 9
ページ= null
長さフィールドの値が変更されていることがわかります。
上記の修正は、実際には、タイトルフィールドのようなオブジェクトフィールドも変更できます。
コードコピーは次のとおりです。
book book = new book();
class <?> aclass = book.getClass();
field [] fields = aclass.getfields();
for(フィールドフィールド:フィールド){
field.setAccessible(true);
if(field.getType()。equals(string.class)){
field.set(book、 "Grimm's Fairy Tale");
} else if(field.getType()。equals(int.class)){
field.set(book、199);
}
}
System.out.println(book);
上記のコードの出力結果は次のとおりです。
コードコピーは次のとおりです。
本:
タイトル=グリムのおとぎ話
長さ= 199
ページ= null
実際、すべての文字列タイプのフィールドは「グリムのおとぎ話」に変更され、INTタイプのすべてのフィールドは199に変更されます。このフィールドが何を意味するのかさえわかりません。
次に、ページフィールドを変更します。このフィールドは、配列オブジェクトを作成し、オブジェクトを挿入します。
コードコピーは次のとおりです。
book book = new book();
class <?> aclass = book.getClass();
field [] fields = aclass.getfields();
for(フィールドフィールド:フィールド){
field.setAccessible(true);
if(field.getType()。equals(arraylist.class)){
string genric = field.getGenerictype()。toString();
string genricclass = genric.substring(
genric.indexof( '<') + 1、
genric.indexof( '>'));
class <?> entityClass = class.forname(genricclass);
オブジェクトobj = entityclass.newinstance();
arrayList list = new ArrayList();
list.add(obj);
field.set(book、list);
}
}
System.out.println(book);
出力の結果は次のとおりです。
コードコピーは次のとおりです。
本:
タイトル= null
長さ= 0
ページ= [ページ
]
ページ
ページクラスを直接使用していませんが、ページオブジェクトを作成したことがわかります。
ページオブジェクトの作成ステートメントは、文にあります:entityClass.newInstance()。 NewInstanceステートメントは、クラスオブジェクトの重要な方法であり、このクラスの対応するオブジェクトを作成するために使用されます。もちろん、クラスコンストラクターはそれをサポートしています。さらに、Gengenerictypeメソッドを介して、フィールドのタイプ修飾子を取得できます。ここに置いて、あなたが得るのはarrayList <page>です。この文字列を使用すると、ページクラスをロードして、クラスローダークラスを介してページオブジェクトを作成できます。