反射就是把Java類中的各種成分映射成相應的java類。
一個class代表一份字節碼,那麼一個method代表這個字節碼中的一個方法,一個Constructor代表字節碼中的構造方法。
1、Constructor類
1)得到某個類所有的構造方法
Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
2)得到某一個構造方法
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
實例
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String) constructor.newInstance(new StringBuffer("abc"));
System.out.println(str.charAt(2));
打印:c
2、Field
package ReflectTest;
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
//fieldY的值是多少?是5,錯!fieldY不是對象身上的變量,而是類上,要用它去取某個對象上對應的值
System.out.println(fieldY.get(pt1));
Field fieldX = pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true);
System.out.println(fieldX.get(pt1));
打印:
5
3
實例,把字符串裏面b替換爲a
package ReflectTest;
public class ReflectPoint {
private int x;
public int y;
public String str1 = "ball";
public String str2 = "basketball";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
return str1 + ":" + str2;
}
}
package ReflectTest;
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws Exception {
ReflectPoint pt = new ReflectPoint(3,5);
changeStringValue(pt);
System.out.println(pt);
}
private static void changeStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for(Field field : fields){
if(field.getType() == String.class){
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
}
}
打印結果:aall:aasketaall
3、Method類
String str = "abc";
Method methodCharAt = String.class.getMethod("charAt", int.class);//方法對象
System.out.println(methodCharAt.invoke(str, 1));
System.out.println(methodCharAt.invoke(str, new Object[]{2}));
打印結果:
b
c
說明:如果invoke方法的第一個參數是null,表示Method對象對應的是一個靜態方法。