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

    推荐阅读