java中的反射指的是我们通过Class类对象可以获取类中任何方法以及成员函数,成员变量等,实现了动态调用的功能。
Class:指的是编译后class文件对象
Method:指的是成员方法
Constrouctor:指的是构造方法
Field:成员变量
代码如下:
我们对person进行反射操作
package Reflection;
public class Person {
public String name = "richard";
private String idcard = "14253456";
public String toString(){
return "name:" + name + " idcard:" + idcard;
}
public Person(){
System.out.println("Person类无参数构造");
}
public Person(int a, int b, String s){
System.out.println("Person类有参数构造:a" + a + "b:" + b + "s:" + s);
}
private Person(int a){
System.out.println("Person类有参数的私有构造a:" + a);
}
public void show(){
System.out.println("show 空参数");
}
public void show(int a){
System.out.println("show a:" + a);
}
public void show(String s){
System.out.println("show s:" + s);
}
}
获取构造方法的测试
package Reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 获取构造方法
*/
public class ReflectTest2 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class clazz = Person.class;
//这个是所有的公共constructor
Constructor[] constructors = clazz.getDeclaredConstructors();
for(Constructor constructor : constructors){
System.out.println(constructor);
}
//得到无参构造
Constructor c1 = clazz.getConstructor();
Object o1 = c1.newInstance();
//得到有参构造
Constructor c2 = clazz.getConstructor(int.class, int.class, String.class);
Object o2 = c2.newInstance(1,1,"你好啊");
//得到私有构造
Constructor c3 = clazz.getDeclaredConstructor(int.class);
//暴力反射
c3.setAccessible(true);
Object o3 = c3.newInstance(1);
}
}
获取成员变量的测试
package Reflection;
import java.lang.reflect.Field;
/**
* 获取成员变量
*/
public class ReflectTest3 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException {
Class clazz = Person.class;
//通过公共的无参构造方法创建实例
Object obj = clazz.newInstance();
//通过Person的Class类获得所有的公共成员变量
Field[] fields = clazz.getFields();
for (Field s : fields)
System.out.println(s);
//获得name属性
Field field = clazz.getField("name");
//给name属性赋值为haha
field.set(obj,"haha");
System.out.println(obj);
Field field2 = clazz.getDeclaredField("idcard");
field2.setAccessible(true);
//给idcard赋值
field2.set(obj,"123456");
System.out.println(obj);
}
}
获取成员方法的测试
package Reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 获取成员方法
*/
public class ReflectTest4 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class clazz = Person.class;
Object o = clazz.newInstance();
Method[] declaredMethods = clazz.getMethods();
for (Method method : declaredMethods){
System.out.println(method);
}
Method method1 = clazz.getMethod("show");
method1.invoke(o);
Method method2 = clazz.getMethod("show",
int.class);
method2.invoke(o,2);
Method method3 = clazz.getDeclaredMethod("show",String.class);
method3.invoke(o,"你好啊");
}
}