最近在學習框架的時候多次遇到了反射這個老朋友,之前雖然學過,但是發現對它的掌握依然不是很好,翻了一書,然後也看了一些博客,有了一些比較形象的認識體會,所以就在這裏把這個知識點做一個系統的總結:
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 相關
獲取 Annotation 實例:
getAnnotation(Class<T> annotationClass)
getDeclaredAnnotations()
getParameterAnnotations()
6.泛型相關
泛型類型:ParameterizedType
獲取實際的泛型類型參數數組:getActualTypeArguments()