java中的反射(J2SE入門20)

來源:互聯網
上載者:User

反射

反射,在運行時,動態分析或使用一個類進行工作
類對象是一個描述這個類資訊的對象,對虛擬機器載入類的時候,就會建立這個類的類對象並載入該對象。Class,是類對象的類型。只有對象才會被載入到虛擬機器中。一個類只會被載入一次

獲得類對象的三種方式:(類對象不用new的方法得到的)

1)也可以用類名.Class,獲得這個類的類對象
2)用一類的對象掉用a.getClass(),得到這個對象的類型的類對象
3)也可以使用Class.forName(類名)(Class類中的靜態方法),也可以得到這個類的類對象,(注意,這裡寫的類名必須是全限定名(全名),是包名加類名,XXX.XXX.XXXX)。強制類載入,這種方法是經常使用的。

一個類的類對象是唯一的。
在使用Class.forName(類名)時,如果使用時寫的類名的類,還沒有被載入,則會載入這個類
Class c,c.getSuperclass()這個方法是獲得這個類的父類的類對象c.getInterfaces()會獲得這個類所實現的介面,這個方法返回是一個類對象的數組。

方法對象是類中的方法的資訊的描述。java.lang.reflect.Method,方法類的對象可以通過類對象的getMethods() 方法獲得,獲得的是一個方法對象的數組,獲得類中的定義的所有方法對象,除了構造方法

構造方法對象,是用來描述構造方法的資訊。java.lang.reflect.Constructor構造方法類的對象可以通過類對象的getConstructors()方法獲得,獲得這個類的所有構造方法對象

屬性對象,使用來描述屬性的資訊。java.lang.reflect.Field屬性類的對象對象可以通過類對象getFields() 這個方法是獲得所有屬性的屬性對象
反射可以擷取這個類中定義的方法和屬性的資訊,單一資料型別在使用反射時要轉換成封裝類。

反射可以通過類對象操縱類,產生這個類的對象,調用方法等等。

使用反射構造一個類的對象的步驟

1,獲得類對象(類對象是對類的資訊的描述)
2,獲得構造方法對象(方法對象是類中的方法的資訊的描述)
3,獲得對象(用構造方法對象掉用構造方法,如果是使用無參構造方法,可以跳過第2部,直接使用類對象.newInstance() 方法來獲得這個類的對象)
4,獲得方法對象。
5,用方法對象調用方法(用這個類的對象作為第一參數)。

這裡在調用方法時,方法的參數表,是用用類對象數組表示參數類型的。

其他有關於反射的方法可以查閱API文檔。java.lang.Class,java.lang.reflce包

反射提供了最大的通用性,反射可以繞過編譯器,反射可以訪問對象的私人屬性和方法。

import java.lang.reflect.*;

public class TestReflect {
    public static void main(String[] args) throws Exception {

        // 1.get class Object
        Class c = Class.forName("Student");
        // 2.get Constructor object
        Class[] cs = { String.class };
        Constructor con = c.getConstructor(cs);// 按照參數表來調用制定構造方法。
        // 3.create object
        Object[] os = { "liucy" };
        Object o = con.newInstance(os);
        // 4.get method object
        String methodName = "study";
        Class[] pcs = { String.class };
        Method m = c.getMethod(methodName, pcs);// 按照參數表來獲得制定的方法對象。
        // 5.invoke the method
        Object[] ocs = { "EJB" };
        m.invoke(o, ocs);

    }

}

class Student {
    private String name;

    public Student(String n) {
        this.name = n;
    }

    public void study(String course) {
        System.out.println(name + " studies " + course);
    }

    public void eat(String food) {
        System.out.println(name + " eats " + food);
    }
}

class Teacher {
    String name;

    public Teacher(String n) {
        this.name = n;
    }

    public void teach(String course) {
        System.out.println(name + " teaches " + course);
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.