久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
java的反射機制淺談
[打印本頁]
作者:
51黑bing
時間:
2016-3-22 19:53
標題:
java的反射機制淺談
一、java的反射機制淺談
最近研究java研究得很給力,主要以看博文為學習方式。以下是我對java的反射機制所產生的一些感悟,希望各位童鞋看到失誤之處不吝指出。受到各位指教之處,如若讓小生好好感動,說不定會請各位吃飯哦!
1.何謂反射機制
根據網文,java中的反射機制可以如此定義:
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
2.反射機制如何實現
談到反射機制,最誘人的莫過于“動態”二字了。接觸過C語言的童鞋們都知道,C語言中也有個和“動態”搭上邊的函數:malloc()函數。其實這里的兩個動態是一個意思,都指的是非編譯時處理,抑或運行時處理。這種機制,可以讓程序的彈性增加不少,因為借由此機制,客戶可以在程序運行時改變一些他關心的性質:分配內存(當然他可能 完全不知道這么做了),調用某個類(當然他還是被蒙在鼓里)等。
下面我們就聊聊java中動態機制是如何實現的。
上一篇文章中提到了java的類的加載問題,但沒有更深入地解釋其運行機制,在這里就先談談這個問題。
首先不得不提到的是java.lang.Class這個類。
有這么一段話:
Java程序在運行時,Java運行時系統一直對所有的對象進行所謂的運行時類型標識。這項信息紀錄了每個對象所屬的類。虛擬機通常使用運行時類型信息選準正確方法去執行,用來保存這些類型信息的類是Class類。
也就是說,ClassLoader找到了需要調用的類時(java為了調控內存的調用消耗,類的加載都在需要時再進行,很摳但是很有效),就會加載它,然后根據.class文件內記載的類信息來產生一個與該類相聯系的獨一無二的Class對象。該Class對象記載了該類的字段,方法等等信息。以后jvm要產生該類的實例,就是根據內存中存在的該Class類所記載的信息(Class對象應該和我所了解的其他類一樣會在堆內存內產生、消亡)來進行。
而java中的Class類對象是可以人工自然性的(也就是說開放的)得到的(雖然你無法像其他類一樣運用構造器來得到它的實例,因為
Class對象都是jvm產生的。不過話說回來,客戶產生的話也是無意義的),而且,更偉大的是,基于這個基礎,java實現了反射機制。
獲取Class對象有三種方式:
1.通過Object類的getClass()方法。例如:
Class c1 = new String("").getClass();
2.通過Class類的靜態方法——forName()來實現:
Class c2 = Class.forName("MyObject");
3.如果T是一個已定義的類型的話,在java中,它的.class文件名:T.class就代表了與其匹配的Class對象,例如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = Double[].class;
這里需要解釋一下3:請記住一句話,java中,一切皆對象。也就是說,基本類型int float 等也會在jvm的內存池像其他類型一樣中生成
一個Class對象。而數組等組合型數據類型也是會生成一個Class對象的,而且更令人驚訝的是,java中數組的本來面目其實就是某個類,驚訝
中的驚訝是,含有相同元素的相同維數的數組還會共同享用同一個Class對象!其實根據我的臆想,數組的length性質應該就保存在這個Class
對象里面。
Class類中存在以下幾個重要的方法:
1.getName()
一個Class對象描述了一個特定類的特定屬性,而這個方法就是返回String形式的該類的簡要描述。由于歷史原因,對數組的Class對象
調用該方法會產生奇怪的結果。
2.newInstance()
該方法可以根據某個Class對象產生其對應類的實例。需要強調的是,它調用的是此類的默認構造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
3.getClassLoader()
返回該Class對象對應的類的類加載器。
4.getComponentType()
該方法針對數組對象的Class對象,可以得到該數組的組成元素所對應對象的Class對象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而這里得到的class2對象所對應的就應該是int這個基本類型的Class對象。
5.getSuperClass()
返回某子類所對應的直接父類所對應的Class對象。
6.isArray()
判定此Class對象所對應的是否是一個數組對象。
好啦,現在對Class這個類應該有了一個大致的了解,下面就給出一個反射機制的典型例子供各位分析:
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Java Reflection Cookbook
*
* @author Michael Lee
* @since 2006-8-23
* @version 0.1a
*/
public class Reflection {
/**
* 得到某個對象的公共屬性
*
* @param owner, fieldName
* @return 該屬性對象
* @throws Exception
*
*/
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
/**
* 得到某類的靜態公共屬性
*
* @param className 類名
* @param fieldName 屬性名
* @return 該屬性對象
* @throws Exception
*/
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
/**
* 執行某對象方法
*
* @param owner
* 對象
* @param methodName
* 方法名
* @param args
* 參數
* @return 方法返回值
* @throws Exception
*/
public Object invokeMethod(Object owner, String methodName, Object[] args)
throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
/**
* 執行某類的靜態方法
*
* @param className
* 類名
* @param methodName
* 方法名
* @param args
* 參數數組
* @return 執行方法返回的結果
* @throws Exception
*/
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(null, args);
}
/**
* 新建實例
*
* @param className
* 類名
* @param args
* 構造函數的參數
* @return 新建的實例
* @throws Exception
*/
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
/**
* 是不是某個類的實例
* @param obj 實例
* @param cls 類
* @return 如果 obj 是此類的實例,則返回 true
*/
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}
/**
* 得到數組中的某個元素
* @param array 數組
* @param index 索引
* @return 返回指定數組對象中索引組件的值
*/
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}
}
復制代碼
例子的解釋就免了,因為讀代碼加上自己理解是最好的程序員學習方式。另外,此代碼來源為互聯網。
好啦,就到這里了。當你知道了java的反射機制后,以后當你接觸到java的動態代理時就不會像我一樣茫然了。好啦,謝謝圍觀!
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩精品欧美
|
久久亚洲天堂
|
91一级片
|
超碰av在线
|
国产午夜精品一区二区三区视频
|
欧美一二区
|
欧美日韩成人在线
|
免费在线观看黄
|
国模精品视频一区二区
|
草草视频在线观看
|
国产伦精品一区二区三区视频我
|
igao视频在线
|
亚洲第一视频网站
|
久草视频免费在线
|
国产成人免费视频
|
青青草手机在线视频
|
免费成人在线观看视频
|
亚洲天堂网址
|
成人做爰免费视频免费看
|
一级黄色免费
|
xxxxx国产
|
四川一级毛毛片
|
日b视频在线观看
|
日韩国产一区二区
|
69成人网
|
91福利在线观看
|
国产成人在线观看免费网站
|
日韩特黄
|
欧美一区二区三区在线观看
|
日韩在线免费播放
|
成人三级视频在线观看
|
久久免费看视频
|
国产成人一区二区
|
91蜜桃在线观看
|
中文字幕在线观看一区二区三区
|
麻豆视频国产
|
日韩一区中文字幕
|
国产日韩欧美在线观看
|
亚洲激情欧美激情
|
中文字幕av一区
|
亚洲精品在线观看视频
|