java反射的概念:java的反射機制是指在運行狀態下,對於一個類來講,能夠獲得這個類的全部方法和屬性。對於一個對象來講,能夠調用這個對象的人和方法和屬性。 反射機制首先會拿到該類的字節碼文件(Class文件),而後反向獲取這個類的全部信息。(注意:一個類型的類在運行中,只產生一個class文件)java
既然反射的前置條件是獲取class類,因此不得不提出獲取class的方法。ide
獲取class的幾種方式:代理
(1)Persion p=new Persion();code
Class c=p.getClass(); 該方法不推薦使用,由於已經有了persion對象,反射畫蛇添足。
(2)Class c=Persion.class;對象
任意的類都是繼承object類,任何類也都有.class屬性,說明object裏面有一個class用來獲取類的信息,可是該方法須要倒入包,依賴強。
(3)Class c =Class.forName("com.xxxx.xxxx")繼承
推薦第三種,無序導包,效率較高。
以上三種方法得到的c對象都是同一個對象,由於類在運行的過程當中,只產生一個class文件。接口
反射重要的類和方法get
(1)Class類it
getName():得到類的完整名字。
getFields():得到類的public類型的屬性。
getDeclaredFields():得到類的全部屬性。包括private 聲明的和繼承類
getMethods():得到類的public類型的方法。
getDeclaredMethods():得到類的全部方法。包括private 聲明的和繼承類
getMethod(String name, Class[] parameterTypes):得到類的特定方法,name參數指定方法的名字,parameterTypes 參數指定方法的參數類型。
getConstructors():得到類的public類型的構造方法。
getConstructor(Class[] parameterTypes):得到類的特定構造方法,parameterTypes 參數指定構造方法的參數類型。
newInstance():經過類的不帶參數的構造方法建立這個類的一個對象。io
boolean isPrimitive = class1.isPrimitive();//判斷是不是基礎類型
boolean isArray = class1.isArray();//判斷是不是集合類
boolean isAnnotation = class1.isAnnotation();//判斷是不是註解類
boolean isInterface = class1.isInterface();//判斷是不是接口類
boolean isEnum = class1.isEnum();//判斷是不是枚舉類
boolean isAnonymousClass = class1.isAnonymousClass();//判斷是不是匿名內部類
boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判斷是否被某個註解類修飾
String className = class1.getName();//獲取class名字 包含包名路徑
Package aPackage = class1.getPackage();//獲取class的包信息
String simpleName = class1.getSimpleName();//獲取class類名
int modifiers = class1.getModifiers();//獲取class訪問權限
Class<?>[] declaredClasses = class1.getDeclaredClasses();//內部類
Class<?> declaringClass = class1.getDeclaringClass();//外部類
(2)Field類(通常於Class類連用)
Class c =Class.forName("XXXX"); Field fields=c.getDeclaredFields("fieldName"); fields.setAccessible(true);//設置私有變量可訪問 Object obj=c.newInstance(); fields.set(obj,"xxx")//設置變量的值
(3)Method
Class.forName("com.XXX.XXX." + className).newInstance().getMethod("methodName").invoke("methodName",String ...)//調用反射對象的方法
(4)Constructor類
Constructor<?> cons=Class.forName("com.XXX.XXX." + className).getConstructor(Param.class)//Param可謂int,String,Object等,對應着對象的param類型的構造方法。
cons.newInstance(Param.class.newInstance());//param的具體值(對象)
反射的應用場景:
(1)簡單工廠
(2)代理模式
(3)通常還和配置文件共同使用
Class clazz = Class.forName("com.XXX.XXX." + className);//className爲配置文件className的值Object obj = clazz.newInstance();Method method = clazz.getMethod(methodName);//methodName爲配置文件methodName的值method.invoke(obj);