package JavaReflcet;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/*
*/
public class ReflactionTest {
// 反射之前对于person类的操作
@Test
public void test1(){
// 创建person类的对象
person p1 = new person("Tom",12);
// 调用其内部的属性和方法
p1.setAge(10);
System.out.println(p1);
p1.show();
// 在person类的外部,无法使用person类对象调用person类中私有的结构。
}
// 有了反射之后
@Test
public void test2() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
Class clazz = person.class;
// 1.通过反射可以从创建person类的对象
Constructor con = clazz.getConstructor(String.class, int.class);
Object obj = con.newInstance("Tom",12);
person p = (person) obj;
System.out.println(p);
// 2.通过反射调用对象的属性。
Field age = clazz.getDeclaredField("age");
age.set(p,10);
System.out.println(p);
// 调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p);
// 3.通过反射调用私有结构。比如:私有构造器、属性、方法
// 调用了person类中的私有构造器 (String name)
Constructor cons1 = clazz.getDeclaredConstructor(String.class);
cons1.setAccessible(true);
person p1 = (person) cons1.newInstance("jerry");
System.out.println(p1);
// 调用私有属性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"hanmeimei");
System.out.println(p1);
// 调用私有方法
Method method = clazz.getDeclaredMethod("showNation", String.class);
method.setAccessible(true);
String nation = (String) method.invoke(p1,"中国"); //相当于 p1.showNation(”中国“)
System.out.println(nation);
}
}