Java中的反射

1、概述:

  簡要的來講,Java中的反射機制就是容許程序在運行期間經過Reflection的Api來取得任何類的內部信息,而且可以直接操做任意對象的內部屬性和方法。數組

2、Class類:

  1.反射從Class類開始

  要想使用反射,首先咱們須要獲得Class對象,而後才能經過Class對象獲取Constructor、Field、Method等對象。spa

  2.獲得Class對象

  • 經過對象獲取Class對象:obj.getClass();
  • 經過類名點上class:假設有一個Person類,Person.class這個樣子
  • 經過類的全限定類名來獲取Class對象:Class.forName("com.buwei.Person")
  • 注:一個.class對象,在方法區中只對應一個Class對象

  3.加載類

  咱們都知道main方法是程序的入口,name是否是全部的class文件都會在main方法執行以前就已經加載到方法區中了呢,答案是否是的。通常狀況下只有須要執行到某個類的代碼時,纔回去ClassPath中加載class文件。若是程序從頭至尾都沒有使用到某個類,那麼這個類對應的class文件就不會被加載到內存。對象

  可能致使一個類被加載的可能有:接口

  • 使用一個類的靜態方法
  • 使用一個類的靜態屬性
  • 建立這個類的對象
  • 使用Class.forName()方法加載類
  • 反序列化一個類的對象
  • 加載一個類的子類時,也會加載其父類
  • 加載一個類時,也會加載與該類相關的類
  • 注:若是當前類沒有被加載過,纔會去加載,若是已經加載到方法區中了,就不可能再去加載。

  4.Class類的方法

  方法1:內存

  • String getName():返回類名;
  • String getSimpleName():返回簡單類名,不包含包名,但數組類型使用它比價方便;
  • Class getSuperClass():獲取父類,Object.class.getSuperClass()返回null;
  • int getModifiers():獲取類的全部修飾符信息;

  方法2:rem

  • Constructor getConstructor(Class... parameterTypes):經過指定的參數類型獲取共有的構造器反射對象;
  • Constructor[] getConstructors():獲取全部的共有構造器;
  • Constructor getDeclaredConstructor(Class ... paremeterTypes):經過指定參數類型獲取構造器反射對象,包含私有構造器對象
  • Constructor[] getDeclaredConstructors():獲取全部構造器對象。包含私有構造器;
  • Field getField(String name):經過名字獲取共有屬性反射對象,包含父類中聲明的共有屬性;
  • Field[] getFields():獲取全部公有屬性反射對象,包含父類中聲明的公有屬性;
  • Field getDeclaredField(String name):經過名字獲取本類中的某個屬性,包含本類的private屬性,可是不包含父類中聲明的任何屬性;
  • Field[] getDeclaredFields():獲取本類中聲明的全部屬性,包含private屬性,但不包含父類中聲明的任何屬性;
  • Method getMethod(String name,Class ... parameterTypes):經過方法名和方法參數類型獲取方法反射對象
  • Method[] getMethods():獲取全部公有方法,包含父類中的公有方法,但不包含任何私有方法;
  • Method getDeclaredMethod(String name, Class… parameterTypes):經過方法名和方法參數類型獲取本類中聲明的方法的反射對象,包含本類中的私有方法,但不包含父類中的任何方法;
  • Method[] getDeclaredMethods():獲取本類中全部方法,包含本類中的私有方法,但不包含父類中的任何方法。

  方法3:字符串

  • boolean isArray():是否爲數組類型;
  • boolean isAnnotation():是否爲註解類型;
  • boolean isAnnotationPresent(Class annotationClass):當前類是否被annotationClass註解了;
  • boolean isEnum:是否爲枚舉類型;
  • boolean isInterface:是否爲接口類型;
  • boolean isPrimitive:是否爲基本類型;
  • boolean isSynthetic:是否爲引用類型;

  方法4:get

  • T newInstance:使用本類的無參構造器來建立本類的對象;

3、其餘反射類

  其餘反射類偶在Java.lang.reflect包下it

  1.AccessibleObject

  AccessibleObject類是Constructor、method、Field三個類的父類io

  • Annotation getAnnotation(Class annotationClass):獲取做用在當前成員上的annotationClass類型的註解對象;
  • Annotation[] getAnnotations():獲取做用在當前成員上的全部註解對象;
  • boolean isAccessible():判斷當前成員是否可訪問;
  • void setAccessible(boolean flag):設置當前成員是否可訪問。

  2.Constructor

  • String getName():獲取構造器名;
  • int getModifiers():獲取構造器上的全部修飾符信息;
  • Class getDeclaringClass():獲取構造器所屬的類型;
  • Class[] getParameterTypes():獲取構造器的全部參數的類型;
  • Class[] getExceptionTypes():獲取構造器上聲明的全部異常類型;
  • T newInstance(Object… initargs):經過構造器反射對象調用構造器。

  3.Method

  • String getName():獲取方法名;
  • int getModifiers():獲取方法上的全部修飾符信息;
  • Class getDeclaringClass():獲取方法所屬的類型;
  • Class[] getParameterTypes():獲取方法的全部參數的類型;
  • Class[] getExceptionTypes():獲取方法上聲明的全部異常類型;
  • Class getReturnType():獲取方法的返回值類型;
  • Object invode(Object obj, Object… args):經過方法反射對象調用方法,若是當前方法是實例方法,那麼當前對象就是obj,若是當前方法是static方法,那麼能夠給obj傳遞null。args表示是方法的參數;

  4.Field

  • String getName():獲取屬性名;
  • int getModifiers():獲取屬性上的全部修飾符信息;
  • Class getDeclaringClass():獲取屬性所屬的類型;
  • Class getType():獲取當前屬性的類型;
  • Object get(Object obj):獲取obj對象的當前屬性值;
  • void set(Object obj, Object value):設置obj對象的當前屬性值爲value;
  • XXX getXXX(Object obj):若是當前屬性爲基本類型,可使用getXXX()系列方法獲取基本類型屬性值。假如當前屬性爲int類型,那麼可使用getInt(Object obj)方法獲取obj對象的當前屬性值;

  5.Modifier

  modifier類有一系列的static方法用來解析其餘getModifiers()方法返回的int值。

Method m = …

int m = m.getModifiers();

boolean b1 = Modifier.isAbstract(m);//解析m中是否包含abstract修飾

boolean b2 = Modifier.isStatic(m);//解析m中是否包含static修飾

String s = Modifiers.toString(m);//把全部修飾都轉換成字符串
相關文章
相關標籤/搜索