一、反射機制 :
將類的各個部分 組成一個新的對象(Class 對象) 就是反射機制
二、獲取反射對象
通過 對象名.getClass()
通過 類名.class 來獲取
Class.forName(“完整的包名+類名”)
Person person = new Person();
Class pClass1 = person.getClass();
Class pClass2 = Person.class;
Class pClass3 = Class.forName("com.project.demo.Person");
三、 獲取構造方法
public Constructor<?>[] getConstructors():獲取所有的公有的構造方法
public Constructor<?>[] getDeclaredConstructors():獲取所有的構造方法
public Constructor<T> getConstructor(@RecentlyNullable Class<?>... parameterTypes):獲取單個共有構造方法
public Constructor<T> getDeclaredConstructor(@RecentlyNullable Class<?>... parameterTypes):獲取單個私有構造方法
Class cla = Class.forName("com.project.demo.Person");
//獲取私有的單個構造方法(匹配參數)
Constructor con = cla.getDeclaredConstructor(String.class);
//對于私有構造方法需要使用暴力反射去除私有
con.setAccessible(true);
//通過反射來實例化對象 Person per = new Person()
Person per = (Person) con.newInstance("p");
四、獲取成員方法
public Method[] getMethods():獲取所有的公有的方法包括父類方法
public Method[] getDeclaredMethods():獲取所有方法
public Method getMethod(@RecentlyNonNull String name, @RecentlyNullable Class<?>... parameterTypes):獲取單個公有的方法
public Method getDeclaredMethod(@RecentlyNonNull String name, @RecentlyNullable Class<?>... parameterTypes):獲取單個私有的方法
Class cla = Class.forName("com.project.demo.Person");
//獲取私有的單個構造方法(匹配參數)
Constructor con = cla.getDeclaredConstructor(String.class);
//對于私有構造方法需要使用暴力反射去除私有
con.setAccessible(true);
//通過反射來實例化對象 Person per = new Person()
Person per = (Person) con.newInstance("p");
//獲取私有的成員方法(匹配方法名和參數)
Method met = cla.getDeclaredMethod("speck",String.class);
//使用暴力反射去除私有
met.setAccessible(true);
//調用方法
Object o = met.invoke(per,"阿豪");
五、反射獲取成員變量
public Field[] getFields():獲取公有的成員變量
public native Field[] getDeclaredFields():獲取所有的成員變量
public Field getField(@RecentlyNonNull String name):獲取單個共有成員變量
public native Field getDeclaredField(@RecentlyNonNull String var1):獲取單個私有的成員變量
Class cla = Class.forName("com.project.demo.Person");
//獲取私有的單個構造方法(匹配參數)
Constructor con = cla.getDeclaredConstructor(String.class);
//對于私有構造方法需要使用暴力反射去除私有
con.setAccessible(true);
//通過反射來實例化對象 Person per = new Person()
Person per = (Person) con.newInstance("p");
Field f =cla.getDeclaredField("age");
//使用暴力反射去除私有
f.setAccessible(true);
//設置成員變量值
f.set(per,18);