❶ java的反射機制是什麼,如何實現
Java中的反射機制,通俗點解釋就是能夠在程序運行中動態獲取到內存中任一對象的信息,這些信息包括對象所屬類、類中的方法和屬性、以及它們的訪問控制域和返回值類型等等,還可以通過反射動態調用對象中的方法,而不管該方法的訪問域是私有或是公開,包括構造方法,還能實現動態代理等。總之,反射能夠破壞掉JAVA類本身的封裝性,進而獲取其私有的或公開的信息,也就能突破封裝進而調用私有的或公開的方法。
實現的話就是通過反射介面,JAVA把反射相關的類介面都封裝在了java.lang.reflect這個包中,你可以研究下這個包中的類,對於類的每一個屬性,如變數、方法,構造方法,這個包中都就與之相對應的類,通過這個類就可以操作這個屬性了。
java反射很強大,但也很危險,在實際開發中應少用或不用,在必要用之時,往往也能解決你遇到的問題。
❷ 怎麼理解Java中的反射,作用是什麼
反射是審查元數據並收集關於它的類型信息的能力。元數據(編譯以後的最基本數據單元)就是一大堆的表,當編譯程序集或者模塊時,編譯器會創建一個類定義表,一個欄位定義表,和一個方法定義表等.
反射的主要作用是用來擴展系統和動態調用程序集。
所謂擴展系統就是先把系統寫好,系統裡面定義介面,後面開發的人去寫介面的代碼。
此時該系統就要用反射了,系統用反射調用介面,當介面沒寫,系統利用反射就不會不會出錯,此時就等於沒實現此功能而已,當介面被人寫好了,系統就會自動調用介面的功能展現在系統上。
即反射實現即插即用功能。
動態調用程序集就是利用反射去調用編譯好的dll,當然此時的dll沒有被引用到你所建的工程裡面。
當你編譯你的工程時,不會編譯你調用的dll,當你運行到調用dll時,此時才會去調用dll,判斷是否有語法語義,等編譯,運行的錯誤。
這樣利用反射具有一定靈活性,就是不用從你的工程調用dll,還有就是dll可隨時改變(當然介面還是要對應),不需改變你所建的工程。
總之反射最好的好處就是新建工程時後不須一定要寫好dll,可新建完工程後,後期寫dll也可以。即所謂後期綁定。當然利用反射是耗資源的,損失效率,如果不是在上面的場合利用此技術,可能不會帶來好處,反而是壞處。
❸ 如何利用java反射,獲取屬性介面的具體類
你可以這么寫:
class BodyImpl implements Body{
//do something
public static void main(String[] args) {
Type[] interfaces = BodyImpl.class.getInterfaces();
ParameterizedType firstInterface = (ParameterizedType) interfaces[0];
Class c = (Class) firstInterface.getActualTypeArguments()[0];
System.out.println(c.getName()); // prints "AtomEntry"
}
}
就得到你所要的介面參數了!
❹ 什麼是反射什麼Java反射
java反射是什麼意思呢?下面帶大家了解一下。
JAVA反射是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。反射是一種強大的工具,能夠創建靈活的代碼,可以使代碼在運行時裝配,無需在組件之間進行源代表鏈接。
JAVA反射機制是在運行狀態中,知道所有屬性和方法,對於任意一個對象,能夠調用它的方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能的反射機制。
反射適合用在哪
首先我們先思考一個問題,反射適合使用在哪裡呢?從功能上看,反射似乎無所不能,幾乎所有的類,所有的屬性、方法、構造我們都能使用,但是我們細細思考一下,在實際開發中,並不是所有場景都需要使用反射獲取屬性或者方法進行操作,反而更多的使用實例.xxx方式操作,而當這些操作重復次數較多的時候,我們往往會考慮優化代碼,減少代碼冗餘,提高復用,比如實體構建賦值等操作,這個時候往往是我們最需要復用的地方,所以我們可以大體認為反射主要使用在實體操作過程中。而在一般操作數據的過程中,我們的實體一般都是知道並且依賴於對應的數據類型的,比如:
1.根據類型new的方式創建對象
2.根據類型定義變數,類型可能是基本類型也可能是引用類型、類或者介面
3.將對應類型的對象傳遞給方法
4.根據類型訪問對象的屬性,調用方法等操作
以上這些操作都是數據操作的過程中最常見也是最難復用優化的地方,而如果這里的操作使用反射則可以實現動態的操作不同的類型的實例,通過調用反射入口類Class,獲取對應的屬性、構造、方法完成對應的操作
❺ Java反射實現幾種方式
1. 通過Object類的getClass方法來獲取
java.lang.Object中定義有getClass方法:public final Class getClass()
所有Java對象都具備這個方法,該方法用於返回調用該方法的對象的所屬類關聯的Class對象,例如:
Date date1 = new Date();
Date date2 = new Date();
Class c1 = date1.getClass();
Class c2 = date2.getClass();
System.out.println(c1.getName());
// java.util.Date
System.out.println(c1 == c2);
// true
上面的代碼中,調用Date對象date1的getClass方法將返回用於封裝Date類信息的Class對象。
這里調用了Class類的getName方法:public String getName(),這個方法的含義很直觀,即返回所封裝的類的名稱。
需要注意的是,代碼中的date1和date2的getClass方法返回了相同的Class對象(c1==c2的值為true)。這是因為,對於相同的類,JVM只會載入一次,而與該類對應的Class對象也只會存在一個,無論該類實例化了多少對象。
另外,需要強調的是,當一個對象被其父類的引用或其實現的介面類型的引用所指向時,getClass方法返回的是與對象實際所屬類關聯的Class對象。例如:
List list = new ArrayList();
System.out.println(list.getClass().getName()); // java.util.ArrayList
上面的代碼中,語句list.getClass()方法返回的是list所指向對象實際所屬類java.util.ArrayList對應的 Class對象而並未java.util.List所對應的Class對象。有些時候可以通過這個方法了解一個對象的運行時類型,例如:
HashSet set = new HashSet();
Iterator it = set.iterator();
System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator
從代碼可以看出,HashSet的iterator方法返回的是實現了Iterator介面的HashMap內部類(KeyIterator)對象。
因為抽象類和介面不可能實例化對象,因此不能通過Object的getClass方法獲得與抽象類和介面關聯的Class對象。
2. 使用.class的方式
使用類名加「.class」的方式即會返回與該類對應的Class對象。例如:
Class clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
這個方法可以直接獲得與指定類關聯的Class對象,而並不需要有該類的對象存在。
3. 使用Class.forName方法
Class有一個著名的static方法forName:public static Class forName(String className) throws ClassNotFoundException
該方法可以根據字元串參數所指定的類名獲取與該類關聯的Class對象。如果該類還沒有被裝入,該方法會將該類裝入JVM。
該方法聲明拋出ClassNotFoundException異常。顧名思義,當該方法無法獲取需要裝入的類時(例如,在當前類路徑中不存在這個類),就會拋出這個異常。
例如,如果當前類路徑中存在Foo類:
package org.whatisjava.reflect;
public class Foo {
public Foo() {
System.out.println("Foo()");
}
static {
System.out.println("Foo is initialized");
}
}
運行下面的代碼:
Class clazz = Class.forName("org.whatisjava.reflect.Foo");
控制台會有如下輸出:
Foo is initialized
Class.forName("org.whatisjava.reflect.Foo")首先會將reflection.Foo類裝入JVM,並返回與之關聯的Class對象。JVM裝入Foo類後對其進行初始化,調用了其static塊中的代碼。需要注意的是:forName方法的參數是類的完 整限定名(即包含包名)。
區別於前面兩種獲取Class對象的方法:使用Class.forName方法所要獲取的與之對應的Class對象的類可以通過字元串的方式給定。該方法通常用於在程序運行時根據類名動態的載入該類並獲得與之對應的Class對象。
通過上面的文章相信你對java的反射機制有了一定的認識,同時也對java中Class類的用法有了比較清晰的理解,在我們實際工作的過程中,我們不斷的運用java知識來解決實際生活中的問題的時候我們就能對java反射機制有一個更深入的理解!
❻ 如何利用java反射構造一個類,使之實現一個介面和一些功能
可以實現,很方便。我去找個例子貼給你
Class FactoryClass = Class.forName(Name);
//Name是DAOFactory實現類的名字
// types of the constructor arguments
Class[] constrArgs = {Properties.class};
Object[] args = {Props};
//Props是Properties類型,它的內容來自一個配置文件
// get Constructor of this class with matching parameter types
Constructor<IDAOFactory> constructor = FactoryClass.getConstructor(constrArgs);
this.factory = constructor.newInstance(args);