1. 程式人生 > >Java-反射機制(reflection)

Java-反射機制(reflection)

一.概述

反射機制是Java提供的一項比較高階的功能,一般的Java開發者使用它的時候相對比較少。但是,java的反射卻是大多數框架的基礎,例如,Struts,Hibernate,Spring等,反射機制就好像外科醫生的解剖工具,突然從外太空來了一個人,如何知道他的具體構造呢?最好的辦法就是把他解剖來看一看,反射機制就是用來解剖Java的類,介面,方法,屬性等元素的。

二.反射原理

反射是為了能夠動態的載入一個類,動態的呼叫一個方法,動態的訪問一個屬性等動態要求而設計的。他的出發點就在於每個類建立一個java.lang.class類的例項,通過該物件可獲取這個類的資訊,然後通過該物件可以獲取這個類的資訊,然後通過java.lang.reflect包下的API以達到各種動態需求

三.獲取物件的型別(Class物件)

1.Object.getclass()
2.Class.forname(“類名”)
3.類名.class
#四.類物件的功能

1.用反射方式建立物件

正常建立物件:new 類名();
反射建立物件:類物件.newInstance();//建立一個新例項,限制1: 要求物件有無參構造 限制2: 構造方法不能私有

2.獲取方法資訊

類物件.getMethods();//獲取所有公共方法,包括繼承的
類物件.getDeclaredMethods(); // 獲取本類的所有方法(public, private, protected, 不加)
類物件.getMethod(方法名, 引數型別); // 找公共方法, 包括繼承的
類物件.getDeclaredMethod(方法名, 引數型別); // 找本類的,不包括繼承的

3.獲取屬性資訊

類物件.getFields(); // 獲取所有公共屬性(包括繼承的)
類物件.getDeclaredFields(); // 獲取本類所有屬性(private public protected 不加)(不包括繼承的)
類物件.getField(“屬性名”);
類物件.getDeclaredField(“屬性名”);

4.獲取構造方法

類物件.getConstructors(); // 獲取所有公共的構造方法
類物件.getDeclaredConstructors(); // 獲取本類所有構造方法(private public protected 不加)
類物件.getConstructor(int.class); // 獲取int引數型別的構造
類物件.getConstructor(); // 獲得無參構造
類物件.getDeclaredConstructor();//獲取私有構造
當構造方法私有獲取想通過有參構造建立物件,這兒就可以用另外一個方法建立物件
構造物件.newInstance()
例子
在這裡插入圖片描述

5.反射呼叫方法

正常呼叫方式: 物件.方法名(引數)
反射呼叫方式: 方法.invoke(物件, 引數);
缺點:呼叫複雜,效率低
優點:可以呼叫私有方法,突破正常方法的限制, 經常用在開源框架中

五.如何載入一個不再classpath下的類(類載入器)

例子:比如別人發給你一個.class檔案
在這裡插入圖片描述