黒馬プログラム--java反射例
3086 ワード
-------------------------------androidトレーニング、あなたとの交流を楽しみにしています。-------------------------------反射:classをjavaクラスConstructorコンストラクタ1にマッピングし、すべての構造方法を得る
2、ある構造方法を得る
3、オブジェクトの作成
注:class.新Instance()とconstructor.新Instance()の違い:前者は非パラメトリックコンストラクション関数のみを呼び出してインスタンスオブジェクトを作成し、後者は非パラメトリックと非パラメトリックコンストラクション関数を呼び出してインスタンスオブジェクトFieldを作成できます:メンバー関数の反射
Method:メソッドの反射
配列の反射:
//jdk以前のバージョンと互換性があるため、反射時にメソッドに配列パラメータがある場合、呼び出し時にコンパイラがパラメータを暗黙的にパッケージ化するため、呼び出し時に再度パッケージ化する
Constructor[] ctc=Class.forName(“”).contructors();
2、ある構造方法を得る
Constructor ctc=Class.forName().getConstructor(StringBuffer.class)
3、オブジェクトの作成
String str=(String)Ctc.newInstance(new StringBuffer(“abc”));
注:class.新Instance()とconstructor.新Instance()の違い:前者は非パラメトリックコンストラクション関数のみを呼び出してインスタンスオブジェクトを作成し、後者は非パラメトリックと非パラメトリックコンストラクション関数を呼び出してインスタンスオブジェクトFieldを作成できます:メンバー関数の反射
//
public class ReflectPoint {
private int x;
public int y;
public String str1="ball";
public String str2="basketball";
public String itcast="itcast";
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception{
ReflectPoint r=new ReflectPoint(3, 5);
Field x=r.getClass().getField("y");
// f.setAccessible(true);
System.out.println(x.get(r));//field , ,
Field y=r.getClass().getDeclaredField("x");//
y.setAccessible(true);//
System.out.println(y.get(r));
Field[] fileds=r.getClass().getFields();//
for (Field field : fileds) {
if(field.getType()==String.class){// ==
String oldstr=(String)field.get(r);
String newstr=oldstr.replaceAll("a", "b");
field.set(r, newstr);//
}
}
}
Method:メソッドの反射
public class ReflectPoint {
private int x;
public int y;
public String str1="ball";
public String str2="basketball";
public String itcast="itcast";
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
public static void staticMethodReflect(){
System.err.println("aaaaa");
}
public void methodReflect(String str){
System.err.println(str);
}
@Override
public String toString(){
return x+":"+y;
}
}
// methodReflect
Method method=r.getClass().getMethod("methodReflect",String.class);// , class
method.invoke(r,"aaaa");//
//
Method method2=r.getClass().getMethod("staticMethodReflect",String.class);
method2.invoke(null,"bbbb");//
配列の反射:
Public static void main(string[] arg){
……..
}
Method method2=r.getClass().getMethod("main",String[].class);
method2.invoke(null,new object[]{new String[]{"abc","bcd"}});
//jdk以前のバージョンと互換性があるため、反射時にメソッドに配列パラメータがある場合、呼び出し時にコンパイラがパラメータを暗黙的にパッケージ化するため、呼び出し時に再度パッケージ化する