Java進階-反射機制

來源:互聯網
上載者:User

標籤:類載入機制   java語言   世界   ring   rgs   public   使用   system   位元組碼   

Java-Reflect專題

1. Class類的使用

2. 方法的反射

3. 成員變數的反射

4. 建構函式的反射

5. Java類載入機制

 

Class類

1. 在物件導向的世界裡,萬事萬物皆對象。

  Java語言中,靜態成員、普通資料類型類是不是對象呢?

  類是誰的對象呢?

  類是對象,類是java.lang.Class類的執行個體對象(There is a class named Class)

public class Main {    public static void main(String[] args) {        //Foo的執行個體對象如何表示        Foo fool = new Foo();        //Foo這個類 也是一個執行個體對象,Class類的執行個體對象,如何表示呢        //任何一個類都是Class的執行個體對象,這個執行個體對象有三種表示方式        //第一種表示方式--->實際在告訴我們任何一個類都有一個隱含的靜態成員變數class        Class c1  = Foo.class;        //第二種表示方式 已經知道該類的對象通過getClass方法        Class c2 = fool.getClass();        /*         *  官網c1,c2表示了Foo類的類類型(class type)         *  萬事萬物皆對象,         *  類也是對象,是Class類的執行個體對象         *  這個對象我們稱為該類的類類型         */        //不管c1 or c2都代表了Foo類的類類型,一個類只可能是Class類的一個執行個體對象        System.out.println(c1 == c2);//true        //第三種表達方式        Class c3 = null;        try {            c3 = Class.forName("Foo");//類的全路徑名        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        System.out.println(c3 == c2);//true        //我們完全可以通過類的類類型建立該類的對象執行個體        try {            Foo foo = (Foo) c1.newInstance();            foo.print();//foo        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }    }}class Foo{    void  print(){        System.out.println("foo");    }}

2. Class.forName("類的全稱")

  不僅表示了類的類類型,還代表了動態載入類

  請大家區分編譯、運行

  編譯時間刻載入類是靜待載入類、運行時刻載入類是動態載入類

 

3. 基本的資料類型對應的類類型

public class ClassDemo2 {    public static void main(String[] args) {        Class c1 = int.class;//int的類類型        Class c2 = String.class;//String的類類型 String類位元組碼        Class c3 = double.class;        Class c4 = Double.class;        Class c5 = void.class;        System.out.println(c1.getName());//int        System.out.println(c2.getName());//java.lang.String        //不包含包名的類的名稱        System.out.println(c2.getSimpleName());//String        System.out.println(c3.getName());//double        System.out.println(c4.getName());//java.lang.Double        System.out.println(c5.getName());//void    }}

 

4. Class類的基本API操作

擷取類所有的方法的資訊

public class ClassDemo {    public static void main(String[] args) {        String s = "hello";        ClassUtil.printClassMessage(s);    }}
public class ClassUtil {    /**     * 列印類的資訊,包括類的成員函數、成員變數     * @param object 該對象所屬類的資訊     */    public static void printClassMessage(Object object){        //要擷取類的資訊 首先要擷取類的類類型        Class c = object.getClass();//傳遞的是哪個子類的對象 c就是該子類的類類型        //擷取類的名稱        System.out.println("類的名稱是:"+c.getName());        /*         *Method類,方法對象         * 一個成員方法就是一個Method對象         * getMethods()方法擷取的是所有的public的函數,包括父類繼承而來的         * getDeclaredMethods()擷取的是所有該類自己聲明的方法,不論存取權限         */        Method[] ms = c.getMethods();//c.getDeclaredMethods();        for (int i=0; i<ms.length; i++){            //得到方法的傳回值類型的類類型            Class returnType = ms[i].getReturnType();            System.out.print(returnType.getName()+" ");            //得到方法的名稱            System.out.print(ms[i].getName()+"(");            //擷取參數類型--->得到的是參數列表的類型的類類型            Class[] paramTypes = ms[i].getParameterTypes();            for(Class class1:paramTypes){                System.out.print(class1.getName());            }            System.out.println(")");        }    }}

擷取成員變數的資訊

Java進階-反射機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.