黒馬プログラム--java反射例

3086 ワード

-------------------------------androidトレーニングあなたとの交流を楽しみにしています。-------------------------------反射:classをjavaクラスConstructorコンストラクタ1にマッピングし、すべての構造方法を得る
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以前のバージョンと互換性があるため、反射時にメソッドに配列パラメータがある場合、呼び出し時にコンパイラがパラメータを暗黙的にパッケージ化するため、呼び出し時に再度パッケージ化する