「程序運行時,容許改變程序結構或變量類型,這種語言稱爲動態語言」,如Python,Ruby是動態語言;顯然C++,Java,C#不是動態語言,可是JAVA有着一個很是突出的動態相關機制:Reflection。java
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。api
如:iphone
/** * 入門級示例:經過對象獲取 包名.類名 * @author Administrator */ public class Simple { public static void main(String[] args) { Simple s=new Simple(); System.out.println(s.getClass().getName()); } }
Java反射機制,能夠實現如下功能:學習
①在運行時判斷任意一個對象所屬的類;spa
②在運行時構造任意一個類的對象;代理
③在運行時判斷任意一個類所具備的成員變量和方法;code
④在運行時調用任意一個對象的方法;對象
⑤生成動態代理。blog
相關的api爲接口
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mWvKvsKd-1597755624260)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]
打開權限:
add.setAccessible(true);
全部類的對象其實都是Class的實例。這個Class實例能夠理解爲類的模子,就是包含了類的結構信息,相似於圖紙。咱們平常生活中,須要創造一個產品,如想山寨一個iphone手機,怎麼辦?
三種方式能夠實現:
⑴買個iphone手機,拆的七零八落的,開始山寨;
⑵到iphone工廠參觀,拿到iphone磨具,開始山寨;
⑶跑到美國盜取iphone的圖紙,開始山寨,最後一種最暴力,最爽。
序列化:實現serializable接口
反序列化
克隆:實現cloneable接口,重寫clone()方法,修改權限爲public
New 反射
同理,獲取類的class對象,也有三種方式:
①Class.forName(」包名.類名」)//通常儘可能採用該形式
②類.class
③對象.getClass()
示例以下:
public class Source { public static void main(String[] args) { //第一種方式:對象.class Source s=new Source(); Class<?>c1=s.getClass(); //第二種方式:類.class Class<?>c2=Source.class; //第三種方式(推薦方式):Class.forName() Class<?>c3=null; try { c3=Class.forName("com.shsxt.ref.simple.Source"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(c1.getName()); System.out.println(c2.getName()); System.out.println(c3.getName()); } }
有了class對象,咱們就有了一切,這就是反射的源頭,接下來就是「庖丁解牛」。
out.println(c2.getName());
System.out.println(c3.getName()); }
}
有了class對象,咱們就有了一切,這就是反射的源頭,接下來就是「**庖丁解牛**」。 **PS:獲取學習資源技術乾貨:lezijie007(暗號66)**