Atitit.跨語言反射api 兼容性提升與增強 java c#。Net php js
1. 什麼是反射1
1.1. 反射提供的主要功能:2
1.2. 實現反射的過程:2
2. 類反射中所必須的類: 的類反射所需要的類並不多,它們分別是:Field、Constructor、Method、Class、Object,2
3. . 反射的用處3
3.1. 可視化 3
3.2. 系統的靈活性、可擴展性 3
3.3. Json xml序列化3
3.4. 函數指針3
3.5. Rpc3
4. 常用的反射api4
4.1. Apache common-lang 。Reflect 5個類4
4.2. java.lang.reflect; 20個類4
4.3. C# 。Net反射api4
4.4. Php ReflectionClass ReflectionMethod 4
5. C# java的區別實現5
6. 參考5
在運行時環境,能否根據一個類的名字,來得到這個類的屬性和方法?對於任何一個運行時的對象能否動態調用這個對象的方法?答案是可以的。這種動態的獲取類的信息以及動態調用一個對象的方法的機制叫做反射。
什麼是反射:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。這一概念的提 出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所采用,並在Lisp和面向對象方面取得了成績。其中 LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基於反射機制的語言。最近,反射機制也被應用到了視窗系統、操作系統和文件系統中。
1.在運行時判斷任意一個對象所屬的類
2.在運行時構造一個類的對象
3.在運行時判斷一個類所具有的屬性和方法
4.在運行時調用一個對象的方法
1.加載一個類
2.根據這個類動態創建一個對象
3. 動態得到這個對象的方法
4.調用這個對象的方法
允許程序於執行期 Reflection APIs 取得任何已知名稱之 class 的內部信息,包括 package、type parameters、superclass、implemented interfaces、inner classes, outer class, fields、constructors、methods、modifiers,並可於執行期生成instances、變更 fields 內容或喚起 methods。
作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍, EMAIL:[email protected]
轉載請注明來源: http://www.cnblogs.com/attilax/
下面我將對這些類做一個簡單的說明。
Field類:提供有關類或接口的屬性的信息,以及對它的動態訪問權限。反射的字段可能是一個類(靜態)屬性或實例屬性,簡單的理解可以把它看成一個封裝反射類的屬性的類。
Constructor類:提供關於類的單個構造方法的信息以及對它的訪問權限。這個類和Field類不同,Field類封裝了反射類的屬性,而Constructor類則封裝了反射類的構造方法。
Method類:提供關於類或接口上單獨某個方法的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。 這個類不難理解,它是用來封裝反射類方法的一個類。
Class類:類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。
Object類:每個類都使用 Object 作為超類。所有對象(包括數組)都實現這個類的方法。
JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟件組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。
大都都是通過反射等方式來加載外部插件,使得系統與插件解耦的同時,增加了功能
private String exe(HttpServletRequest req) {
String meth = req.getParameter("method");
Handler hd = (Handler) mp.get(meth);
if (hd != null) {
try {
return (String) hd.handleReq(req);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return e.getMessage();
}
}
if (hd == null) {
String classname = refx.getClassName(meth);
String meth_name = refx.getMethodName(meth);
Object o;
try {
o = ConstructorUtils.invokeConstructor(
Class.forName(classname), null);
MethodUtils.invokeMethod(o, meth_name, null);
} catch (Exception e) {
return core.toJsonStrO88(e);
}
獲取實例,調用方法,獲取方法與屬性集合。 獲取注釋 獲取anno
o = ConstructorUtils.invokeConstructor(
Class.forName(classname), null);
Object invokeMethod_ret = MethodUtils.invokeMethod(o, meth_name,
req);
$class = new ReflectionClass('Person');//建立 Person這個類的反射類
不過在C#可以加載程序集Assembly.LoadFile("文件路徑");,JAVA中好
像沒有,因為JAVA最多也就打個JAR包。
在類的裡面的方法,屬性都可以用for或者foreach打印出來。
總結:
看來兩種語言在互相學習,互相COPY,嘿嘿。竟然做一個反射,
思路一樣的。只不過在JAVA中,用的是CLASS,而C#用的是TYPE。
繼續努力,加油!!!
PHP的反射機制 - guisu,程序人生。 逆水行舟,不進則退。 - 博客頻道 - CSDN.NET.htm
PHP的反射類ReflectionClass、ReflectionMethod使用實例_php實例_.htm
JAVA反射與C#反射之比較 - 孤獨游 - 博客頻道 - CSDN.NET.htm
JAVA反射與C#反射_神秘豬_新浪博客.htm
學習:java原理—反射機制 - 飛翔荷蘭人 - 博客園.htm