Java中內(nèi)省和反射都是比較高級(jí)的編程技術(shù),但兩者有著本質(zhì)的區(qū)別。內(nèi)省主要用于檢查和修改JavaBean的屬性,而反射則更加通用,可用于檢查和修改Java對(duì)象的任何屬性和方法。
內(nèi)省是通過(guò)JavaBean的getProperty和setProperty方法來(lái)訪問(wèn)數(shù)據(jù)的技術(shù)。JavaBean是指具有無(wú)參構(gòu)造器和符合JavaBean規(guī)范(setter和getter方法)的類(lèi)。內(nèi)省的作用是通過(guò)反射機(jī)制在編程時(shí)分析類(lèi),獲取它的屬性信息,也可以在運(yùn)行時(shí)“內(nèi)省”(inspect)一個(gè)對(duì)象,了解其屬性和方法,并進(jìn)行相應(yīng)的操作。
// 內(nèi)省示例 Person person = new Person(); PropertyDescriptor pd = new PropertyDescriptor("age", Person.class); Method writeMethod = pd.getWriteMethod(); writeMethod.invoke(person, 18); Method readMethod = pd.getReadMethod(); Object result = readMethod.invoke(person);
反射是Java程序在運(yùn)行時(shí)獲取其內(nèi)部信息的機(jī)制。反射是指程序在運(yùn)行時(shí)檢查和修改自己行為的能力。Java反射機(jī)制允許我們?cè)谶\(yùn)行時(shí)無(wú)需事先知道一個(gè)對(duì)象的類(lèi)型,就可以操作該對(duì)象的屬性和方法。
// 反射示例 Class clazz = Person.class; Object person = clazz.newInstance(); Method writeMethod = clazz.getDeclaredMethod("setAge", int.class); writeMethod.invoke(person, 18); Method readMethod = clazz.getDeclaredMethod("getAge"); Object result = readMethod.invoke(person);
總之,內(nèi)省和反射雖然都是Java高級(jí)編程技術(shù),但是內(nèi)省專(zhuān)注于JavaBean屬性的訪問(wèn)和修改,而反射則更加通用,可從Java對(duì)象中獲取任何屬性和方法,并進(jìn)行相應(yīng)的操作。