Java反射メカニズム学習(二)
2981 ワード
まず、反射によって変数に動的に値を割り当てる方法を見てみましょう.
反射メカニズムによってプログラム実行中に変数に動的に値を付与することを実現するには、以下の点を考慮する必要があります.
1)対応するFiled,Methodオブジェクトの取得方法
2)ダイナミックな値をターゲットオブジェクトに設定する方法
3)プライベートドメイン変数FieldとメソッドMethodはどのように処理しますか?
1つ目は、主にClassオブジェクトを取得することです.Classオブジェクトを取得するには3つの方法があります
a.クラス名class b.オブジェクト名.getClass()は、例えばstu 1を用いる.Studentの代わりにgetClass()classの結果はまったく同じです
c. Class.forName(「クラス名」);
2番目のポイントについては、コードnameField 1.set(stu 1、「張三」);キーです.最初のパラメータはターゲットオブジェクトです.つまりFieldオブジェクトの
setメソッドは、オブジェクトstu 1のname属性に値を割り当てます.
3つ目のポイントでは、ageに値を割り当てる必要がありますが、ageはStudioクラスでプライベート変数であり、外部クラスへのアクセスは許可されません.前の章を思い出す
抽象クラスAccessibleObjectは、Java言語アクセス制御チェックをスキップできるsetAccessibleメソッドを提供します.
コードは次のとおりです.
さらに注意しなければならないのは、
1)、getFieldとgetDeclaredFieldの違いに注意:両方ともjava.lang.Classクラスが提供する方法で、前者は指定したクラスまたはインタフェースの共通属性を取得するために使用され、ageはプライベート属性で後者で取得する必要があります.
2)、ここではageField 2は使用できない.setInt(stu 2,18)はageField 2に代わる.set(stu 2,18),ここでは厳密な検証を行い,Studentではage属性にIntegerタイプを採用した.
package com.reflect.demo;
public class Student {
public String name;
public Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
}
package com.reflect.demo;
import java.lang.reflect.Field;
public class BaseTest {
public static void main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
Student stu1 = new Student();
Field nameField1 = Student.class.getField("name");
nameField1.set(stu1, " ");
System.out.println(" 1 :" + stu1.getName() + " \t :"
+ stu1.getAge());
}
}
反射メカニズムによってプログラム実行中に変数に動的に値を付与することを実現するには、以下の点を考慮する必要があります.
1)対応するFiled,Methodオブジェクトの取得方法
2)ダイナミックな値をターゲットオブジェクトに設定する方法
3)プライベートドメイン変数FieldとメソッドMethodはどのように処理しますか?
1つ目は、主にClassオブジェクトを取得することです.Classオブジェクトを取得するには3つの方法があります
a.クラス名class b.オブジェクト名.getClass()は、例えばstu 1を用いる.Studentの代わりにgetClass()classの結果はまったく同じです
c. Class.forName(「クラス名」);
2番目のポイントについては、コードnameField 1.set(stu 1、「張三」);キーです.最初のパラメータはターゲットオブジェクトです.つまりFieldオブジェクトの
setメソッドは、オブジェクトstu 1のname属性に値を割り当てます.
3つ目のポイントでは、ageに値を割り当てる必要がありますが、ageはStudioクラスでプライベート変数であり、外部クラスへのアクセスは許可されません.前の章を思い出す
抽象クラスAccessibleObjectは、Java言語アクセス制御チェックをスキップできるsetAccessibleメソッドを提供します.
コードは次のとおりです.
Student stu1 = new Student();
Student stu2 = new Student();
Field nameField1 = stu1.getClass().getField("name");
nameField1.set(stu1, " ");
System.out.println(" 1 :"+stu1.getName()+" \t :"+stu1.getAge());
Field ageField2 = stu2.getClass().getDeclaredField("age");
ageField2.setAccessible(true);
ageField2.set(stu2, 18);
System.out.println(" 2 :"+stu2.getName()+" \t :"+stu2.getAge());
さらに注意しなければならないのは、
1)、getFieldとgetDeclaredFieldの違いに注意:両方ともjava.lang.Classクラスが提供する方法で、前者は指定したクラスまたはインタフェースの共通属性を取得するために使用され、ageはプライベート属性で後者で取得する必要があります.
2)、ここではageField 2は使用できない.setInt(stu 2,18)はageField 2に代わる.set(stu 2,18),ここでは厳密な検証を行い,Studentではage属性にIntegerタイプを採用した.