java什么是反射
反射指程序可以訪問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對(duì)象。您可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型。然后,可以調(diào)用類型的方法或訪問(wèn)其字段和屬性。
Java中的反射,我們常見(jiàn)是取得構(gòu)造方法,成員變量,普通方法,還有對(duì)數(shù)組反射的操作。
1、反射的精辟定義:反射就是把Java類中的各種成分映射成相應(yīng)的Java類。
2、Class實(shí)例表示正在運(yùn)行的Java應(yīng)用程序中的類和接口。所有的
3、反射除了方法體得不到,別的都可以得到。包括可以得到類里私有的成員變量。本人覺(jué)得這破壞了Java的封裝性,不知道為什么要這么設(shè)計(jì)。
一、構(gòu)造方法的反射
(1)得到需要反射的類Class。知道類名可以使用forName(String className) 方法。也可以通過(guò)對(duì)象的.getClass方法獲得?;蛘呙鞔_去獲得哪個(gè)類型。比如我們有一個(gè)Person類,我們想得到這個(gè)類的實(shí)例可以寫成 Person.class。
(2)構(gòu)造方法用Constructor類表示??梢酝ㄟ^(guò)剛才得到的Class,使用getConstructor方法獲得,想獲得什么形參的構(gòu)造方法,就傳入什么形參類型的Class,比如想取得String的String(StringBuffer buffer) 構(gòu)造方法可以這樣:String.class.getConstructor(StringBuffer.class)。
(3)使用取得的構(gòu)造方法創(chuàng)建對(duì)象,我們需要使用newInstance方法,形參為可變參數(shù),按上面取得的String的構(gòu)造方法,我們就可以這樣創(chuàng)建對(duì)象,String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer())
二、成員變量的反射
(1)我們同樣需要取得反射的類Class。
(2)Java中使用Field類表示字段,我們想獲得成員變量可以使用Class的getField(String name)方法,參數(shù)為成員變量的名字。也有g(shù)etFields()方法取得該類的所有成員變量,返回值為Field的數(shù)組。取得Field的值,使用 get方法,設(shè)置值使用set方法。
(3)暴力訪問(wèn)私有成員使用setAccessible方法,getType() 取得Field類型,getName()取得Field的字段名稱。
三、普通方法的反射
(1)取得反射類Class。
(2)方法使用Method類定義,獲得方法使用getMethod(String name, Class… parameterTypes) ,用法很像獲得構(gòu)造方法,只是多出一個(gè)方法名的參數(shù)。
(3)getReturnType()獲得方法的返回值類型,getParameterTypes()獲得所有形參類型。
(4)用invoke調(diào)用方法第一個(gè)參數(shù)為需要調(diào)用的對(duì)象,第二個(gè)參數(shù)為用于調(diào)用的參數(shù)。