反射就是把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 = https://www.it610.com/article/(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
【java反射(Constructor类、Field、Method类)】说明:如果invoke方法的第一个参数是null,表示Method对象对应的是一个静态方法。