java反射(Constructor類、Field、Method類)

反射就是把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對象對應的是一個靜態方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章