Java反射メカニズムによる読み取り専用属性パラメータの変更
1347 ワード
次のコードがあります.
JavaReflectのオブジェクトrocを指定します.このオブジェクトのnum値を30または他の整数に変更できますか?
コードから見ると、このクラスはsetメソッドではなくgetメソッドのみを提供し、privateでnumのプロパティを修飾します.したがってnumはこのクラスでは読み取り専用クラスであり、numの値を直接変更することはできません.
しかしnumを修正する目的は反射機構によって達成できる.
実行状態では、任意のクラスについて、このクラスのすべての属性と方法を知ることができます.いずれかのオブジェクトについて.いずれかのメソッドとプロパティを呼び出すことができます.このようなオブジェクト情報と動的オブジェクトを動的に取得する方法の機能はjavaのマッピングメカニズムと呼ばれ、java反射メカニズムはプログラムが実行時にコンパイル中に完全に未知のClassをロードすることを可能にする.つまりjavaは、実行時に名前がわかるClassをロードし、その完全な構造を得ることができます.
この例では、クラスのClassインスタンスを取得すると、num属性に対応するFieldオブジェクトを反射メカニズムで取得し、numの値を変更できます.
コード実装は次のとおりです.
public class javaReflect {
private Integer num=20;
public Integer getNum() {
return num;
}
}
JavaReflectのオブジェクトrocを指定します.このオブジェクトのnum値を30または他の整数に変更できますか?
コードから見ると、このクラスはsetメソッドではなくgetメソッドのみを提供し、privateでnumのプロパティを修飾します.したがってnumはこのクラスでは読み取り専用クラスであり、numの値を直接変更することはできません.
しかしnumを修正する目的は反射機構によって達成できる.
実行状態では、任意のクラスについて、このクラスのすべての属性と方法を知ることができます.いずれかのオブジェクトについて.いずれかのメソッドとプロパティを呼び出すことができます.このようなオブジェクト情報と動的オブジェクトを動的に取得する方法の機能はjavaのマッピングメカニズムと呼ばれ、java反射メカニズムはプログラムが実行時にコンパイル中に完全に未知のClassをロードすることを可能にする.つまりjavaは、実行時に名前がわかるClassをロードし、その完全な構造を得ることができます.
この例では、クラスのClassインスタンスを取得すると、num属性に対応するFieldオブジェクトを反射メカニズムで取得し、numの値を変更できます.
コード実装は次のとおりです.
import java.lang.reflect.Field;
public class javaReflect {
private Integer num=20;
public Integer getNum() {
return num;
}
public void main() {
javaReflect jr=new javaReflect();
Class>cla=javaReflect.class;
try {
Field field=cla.getDeclaredField("num");
field.setAccessible(true);
field.set(cla, 30);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}