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对象对应的是一个静态方法。

你可能感兴趣的:(JAVA反射)