package com.atguigu.Reflection;
import com.atguigu.JavaImportant.Person;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class JavaReflectiom {
@Test
public void test1 () throws Exception {
//1、通過反射建立對象
Class clazz = Person.class;
//用反射的形式調用person的構造器方法
Constructor con = clazz.getDeclaredConstructor(int.class,String.class);
con.setAccessible(true);
//得到了執行個體的對象後 給對象的屬性指派
Person ton = (Person) con.newInstance(20,"Tom");
//通過反射可以調用該類的私有方法。。。
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);
age.set(ton,50);
System.out.println(ton.toString());
Method show = clazz.getDeclaredMethod("show");
show.setAccessible(true);
show.invoke(ton);//相當于ton.show();
/* //反射若是不調用私有權限的方法,屬性
Class clavv = Person.class;
Constructor tim = clavv.getConstructor(int.class,String.class);
Person tim1 = (Person) tim.newInstance(29, “tim”);
Field age1 = clavv.getDeclaredField("age");
age1.set(tim1,21);
Method show1 = clavv.getDeclaredMethod("show");
show1.invoke(tim1);*/
}
//擷取Class的執行個體的方式
//clazz1 = clazz2 = clazz3
@Test
public void test2(){
//方式1:調用運作時類的屬性.class
Class<Person> clazz1 = Person.class;
//方式2:通過運作時類的對象
Person p = new Person();
Class clazz2 = p.getClass();
//方式3:調用class類的靜态方法,forName();
try {
Class clazz3 = Class.forName("com.atguigu.JavaImportant.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//方式4:使用類的加載器:ClassLoader
ClassLoader classLoader = JavaReflectiom.class.getClassLoader();
try {
Class<Person> clazz4 = (Class<Person>) classLoader.loadClass("com.atguigu.JavaImportant.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}