樂字節Java反射之一:反射概念與獲取反射源頭class

1、Java反射機制概念

「程序運行時,容許改變程序結構或變量類型,這種語言稱爲動態語言」,如Python,java

Ruby是動態語言;顯然C++,Java,C#不是動態語言,可是JAVA有着一個很是突出api

的動態相關機制:Reflection。iphone

JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方spa

法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以代理

及動態調用對象的方法的功能稱爲java語言的反射機制。如code

/**
 * 入門級示例:經過對象獲取  包名.類名
 * @author Administrator
 */
public class Simple {
 public static void main(String[] args) {
  Simple s=new Simple();
  System.out.println(s.getClass().getName());
 }
}

Java反射機制,能夠實現如下功能:對象

①在運行時判斷任意一個對象所屬的類;接口

②在運行時構造任意一個類的對象;圖片

③在運行時判斷任意一個類所具備的成員變量和方法;ip

④在運行時調用任意一個對象的方法;

⑤生成動態代理。

相關的api爲
圖片描述

2、 獲取源頭Class(重點)

打開權限:

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對象,咱們就有了一切,這就是反射的源頭,接下來就是「庖丁解牛」。

歡迎繼續關注樂字節Java課程,樂字節原創,學Java,小樂來幫您。

相關文章
相關標籤/搜索