java 基礎:反射

理解

反射:從一個對象獲取到它的類信息。

Class 類和 java.lang.reflect 類庫一起對反射的概念進行了支持。

一個類的信息主要包括屬性、方法、構造器,對應 java.lang.reflect 類庫中的 FieldMethodConstructor,通過 Class 類的 getFields()getMethods()getConstructors() 來獲取。

對於 Field,可以使用 get()set() 方法進行讀取和修改;對於 Method,可以使用 invoke() 方法進行調用;對於 Constructors,可以使用 newInstance() 方法來創建對象。

實例

創建一個 A 類,用來進行之後的反射。

class A {
    public int var;

    public A(int var) {
        this.var = var;
    }

    public void printVar() {
        System.out.println("var is " + var);
    }
}

創建 A 類的對象 a,並從 a 中獲取 A 類的類信息。

public class MyClass {
    public static void main(String[] args) throws Exception {
        A a = new A(6);
        Class<? extends A> aClass = a.getClass();

        println("Fields:");
        Field[] fields = aClass.getFields();
        for (Field field : fields) {
            println(field + " = " + field.get(a));
        }

        println("\nMethods:");
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            println(method);
        }

        println("\nConstructors:");
        Constructor[] constructors = aClass.getConstructors();
        for (Constructor constructor : constructors) {
            println(constructor);
        }
    }

    public static void println(Object o) {
        System.out.println(o);
    }
}

執行後:

Fields:
public int com.example.lib.A.var = 6

Methods:
public void com.example.lib.A.printVar()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

Constructors:
public com.example.lib.A(int)

可見,它完全打印出了整個 A 類的信息,包括屬性、方法、構造函數。

通過 getFields() 獲取到的只是 public 的屬性,如果要獲取私有的,可以使用 getDeclaredFields() 方法。

getMethods()getConstructors() 與之類似。

更多用法可參見 java 文檔Class 類和 java.lang.reflect 類庫相關內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章