JAVA 反射詳解以及基礎使用

最近在學習框架的時候多次遇到了反射這個老朋友,之前雖然學過,但是發現對它的掌握依然不是很好,翻了一書,然後也看了一些博客,有了一些比較形象的認識體會,所以就在這裏把這個知識點做一個系統的總結:

1.反射的基本理解

       反射時java被視爲動態語言的關鍵。 JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。對於正在學習的框架中體現的利用反射的便利性有很大的體會。

反射機制主要提供了一下功能:

①在運行時構造任意一個類的對象

②在運行時獲取任意一個類所具有的成員變量和方法

③在運行時調用任意一個對象的方法或者屬性

④生成動態代理

      

2.class 對象的三種獲取方式

  //class 的初始化    

 Class clazz =null;

直接通過類名獲取

        clazz = Person.class;

②通過對象調用的方法獲得

      Person a =new Person();

       clazz=person.getClass();

③通過全類名的方法獲得(這個也是使用的最廣泛的一個)

     clazz=Class.forname("類名");

//使用Class對象的newInstance()方法實例化
//實例化店用的爲Person的無參的構造器(也就要求寫javabean的時候有無參數的構造函數的存在)
Class<Person> clazz=(Class<Person>)Class.forName("類名");

Object obj=clazz.newInstance();

關於類加載器的一個主要的方法:

InputStream in=null;

in=this.getClass( ).getClassLoader ( ),getResourceAsStream(“test.properities”); //輸入文件應放在src的目錄下面。

 3.Class類的常用方法

方法名

功能說明

static Class forName(String name) 

返回指定類名 name 的 Class 對象

Object newInstance() 

調用缺省構造函數,返回該Class對象的一個實例

Object newInstance(Object []args) 

調用當前格式構造函數,返回該Class對象的一個實例

getName() 

返回此Class對象所表示的實體(類、接口、數組類、基本類型或void)名稱

Class getSuperClass()

返回當前Class對象的父類的Class對象

Class [] getInterfaces() 

獲取當前Class對象的接口

ClassLoader getClassLoader() 

返回該類的類加載器

Class getSuperclass() 

返回表示此Class所表示的實體的超類的Class

4.Method(Field) 對象

代表方法
Class 對象獲取 Method 的方法:
   getDeclaredMethod(String name, Class<?>... parameterTypes) 
   getDeclaredMethods() 
   getMethod(String name, Class<?>... parameterTypes) 
   getMethods() 
Method 對象的方法:
   invoke(Object obj, Object... args)、

5.Annotation 相關

以 Method 爲例:
獲取 Annotation 實例:
getAnnotation(Class<T> annotationClass) 
getDeclaredAnnotations() 
getParameterAnnotations() 

6.泛型相關

獲取父類泛型類型:Type getGenericSuperclass()
泛型類型:ParameterizedType
獲取實際的泛型類型參數數組:getActualTypeArguments() 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章