久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2657|回復: 0
收起左側

java的反射機制淺談

[復制鏈接]
ID:109770 發表于 2016-3-22 19:53 | 顯示全部樓層 |閱讀模式
一、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這個類應該有了一個大致的了解,下面就給出一個反射機制的典型例子供各位分析:
  1.     import java.lang.reflect.Array;     
  2.     import java.lang.reflect.Constructor;     
  3.     import java.lang.reflect.Field;     
  4.     import java.lang.reflect.Method;     
  5.         
  6.         
  7.     /**   
  8.      * Java Reflection Cookbook   
  9.      *   
  10.      * @author Michael Lee   
  11.      * @since 2006-8-23   
  12.      * @version 0.1a   
  13.      */   
  14.         
  15.     public class Reflection {     
  16.         /**   
  17.          * 得到某個對象的公共屬性   
  18.          *   
  19.          * @param owner, fieldName   
  20.          * @return 該屬性對象   
  21.          * @throws Exception   
  22.          *   
  23.          */   
  24.         public Object getProperty(Object owner, String fieldName) throws Exception {     
  25.             Class ownerClass = owner.getClass();     
  26.         
  27.             Field field = ownerClass.getField(fieldName);     
  28.         
  29.             Object property = field.get(owner);     
  30.         
  31.             return property;     
  32.         }     
  33.         
  34.         /**   
  35.          * 得到某類的靜態公共屬性   
  36.          *   
  37.          * @param className   類名   
  38.          * @param fieldName   屬性名   
  39.          * @return 該屬性對象   
  40.          * @throws Exception   
  41.          */   
  42.         public Object getStaticProperty(String className, String fieldName)     
  43.                 throws Exception {     
  44.             Class ownerClass = Class.forName(className);     
  45.         
  46.             Field field = ownerClass.getField(fieldName);     
  47.         
  48.             Object property = field.get(ownerClass);     
  49.         
  50.             return property;     
  51.         }     
  52.         
  53.         
  54.         /**   
  55.          * 執行某對象方法   
  56.          *   
  57.          * @param owner   
  58.          *            對象   
  59.          * @param methodName   
  60.          *            方法名   
  61.          * @param args   
  62.          *            參數   
  63.          * @return 方法返回值   
  64.          * @throws Exception   
  65.          */   
  66.         public Object invokeMethod(Object owner, String methodName, Object[] args)     
  67.                 throws Exception {     
  68.         
  69.             Class ownerClass = owner.getClass();     
  70.         
  71.             Class[] argsClass = new Class[args.length];     
  72.         
  73.             for (int i = 0, j = args.length; i < j; i++) {     
  74.                 argsClass[i] = args[i].getClass();     
  75.             }     
  76.         
  77.             Method method = ownerClass.getMethod(methodName, argsClass);     
  78.         
  79.             return method.invoke(owner, args);     
  80.         }     
  81.         
  82.         
  83.           /**   
  84.          * 執行某類的靜態方法   
  85.          *   
  86.          * @param className   
  87.          *            類名   
  88.          * @param methodName   
  89.          *            方法名   
  90.          * @param args   
  91.          *            參數數組   
  92.          * @return 執行方法返回的結果   
  93.          * @throws Exception   
  94.          */   
  95.         public Object invokeStaticMethod(String className, String methodName,     
  96.                 Object[] args) throws Exception {     
  97.             Class ownerClass = Class.forName(className);     
  98.         
  99.             Class[] argsClass = new Class[args.length];     
  100.         
  101.             for (int i = 0, j = args.length; i < j; i++) {     
  102.                 argsClass[i] = args[i].getClass();     
  103.             }     
  104.         
  105.             Method method = ownerClass.getMethod(methodName, argsClass);     
  106.         
  107.             return method.invoke(null, args);     
  108.         }     
  109.         
  110.         
  111.         
  112.         /**   
  113.          * 新建實例   
  114.          *   
  115.          * @param className   
  116.          *            類名   
  117.          * @param args   
  118.          *            構造函數的參數   
  119.          * @return 新建的實例   
  120.          * @throws Exception   
  121.          */   
  122.         public Object newInstance(String className, Object[] args) throws Exception {     
  123.             Class newoneClass = Class.forName(className);     
  124.         
  125.             Class[] argsClass = new Class[args.length];     
  126.         
  127.             for (int i = 0, j = args.length; i < j; i++) {     
  128.                 argsClass[i] = args[i].getClass();     
  129.             }     
  130.         
  131.             Constructor cons = newoneClass.getConstructor(argsClass);     
  132.         
  133.             return cons.newInstance(args);     
  134.         
  135.         }     
  136.         
  137.         
  138.             
  139.         /**   
  140.          * 是不是某個類的實例   
  141.          * @param obj 實例   
  142.          * @param cls 類   
  143.          * @return 如果 obj 是此類的實例,則返回 true   
  144.          */   
  145.         public boolean isInstance(Object obj, Class cls) {     
  146.             return cls.isInstance(obj);     
  147.         }     
  148.             
  149.         /**   
  150.          * 得到數組中的某個元素   
  151.          * @param array 數組   
  152.          * @param index 索引   
  153.          * @return 返回指定數組對象中索引組件的值   
  154.          */   
  155.         public Object getByArray(Object array, int index) {     
  156.             return Array.get(array,index);     
  157.         }     
  158.     }   
復制代碼


例子的解釋就免了,因為讀代碼加上自己理解是最好的程序員學習方式。另外,此代碼來源為互聯網。



好啦,就到這里了。當你知道了java的反射機制后,以后當你接觸到java的動態代理時就不會像我一樣茫然了。好啦,謝謝圍觀!

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频一区 | 91精品国产美女在线观看 | 国产一区二区三区久久久久久久久 | 国产96在线 | 日韩和的一区二区 | 91看国产 | 狠狠干网站 | 91精品国产综合久久久久久 | 国产激情视频在线免费观看 | 国产综合在线视频 | 久久高清亚洲 | 天天躁日日躁狠狠躁白人 | 日韩免费视频一区二区 | 日本一卡精品视频免费 | 成人在线免费网站 | 一区在线视频 | 欧美一级二级三级视频 | 亚洲精品日日夜夜 | 国产精品日韩高清伦字幕搜索 | 国产三级 | 欧美精品第一页 | 久久久久久久久久一区 | 国产视频h | 黄色片a级 | 国产精品成人一区二区 | 皇色视频在线 | 高清久久久 | 久久国产精品-国产精品 | 一区视频在线播放 | 天堂中文在线播放 | 在线免费观看成年人视频 | 一区二区三区视频在线免费观看 | av手机免费在线观看 | 黄视频国产| 大象一区 | 国产精品一区二区在线 | av三级在线观看 | 在线婷婷 | 日本一区二区高清不卡 | 久久99精品久久久久蜜桃tv | 日本粉嫩一区二区三区视频 |