反射:框架設計的靈魂web
框架:半成品軟件。能夠在框架的基礎上進行軟件開發,簡化代碼框架
反射:將類的各個組成部分封裝爲其餘對象,這就是反射機制(在Class類中包裝)設計
好處:一、能夠在程序運行過程當中,操做這些對象對象
二、能夠解耦,提升程序的可擴展性內存
獲取Class對象的方式:開發
一、Class.forName("全類名"):將字節碼文件加載進內存,返回class對象,全類名就是包名加上類名get
多用於配置文件,將類名定義在配置文件中,讀取文件,加載類servlet
二、類名.class:經過類名的屬性class獲取io
多用於參數的傳遞class
三、對象.getClass():getClass()方法在Object類中定義
多用於對象的獲取字節碼的方式
注意:同一個字節碼文件(*.class)在一次程序運行過程當中,只會被加載一次,不論經過哪種方式獲取的class對象都是同一個。
示例代碼:
public class Demo { public static void main(String[] args) throws Exception{ Class cls1 = Class.forName("lianbang.wu.web.servlet.Person"); System.out.println(cls1); Class cls2 = Person.class; System.out.println(cls2); Person p1 = new Person(); Class cls3 = p1.getClass(); System.out.println(cls3); } }
使用Class對象功能:
獲取功能:一、獲取成員變量
二、獲取構造方法
三、獲取成員方法
四、獲取類名
示例代碼:
public class Demo { public static void main(String[] args) throws Exception{ Class personClass=Person.class; Field[] fields = personClass.getFields(); Field field = personClass.getField("level"); Person p =new Person("讀者",18,2); Object value = field.get(p); System.out.println(value); field.set(p,3); System.out.println(p.level); Field field1 =personClass.getDeclaredField("age"); field1.setAccessible(true); Object value1 =field1.get(p); System.out.println(value1); System.out.println(p.getAge()); Constructor constructor =personClass.getConstructor(String.class,int.class,int.class); Object p1 =constructor.newInstance("新讀者",19,3); Object p2 =personClass.newInstance(); Method method = personClass.getMethod("eat", String.class); method.invoke(p,"飯"); System.out.println(method.getName()); System.out.println(personClass.getName()); } }