天天看點

Java反射學習總結一(基礎篇)

Class類是Reflection API中核心的類,他位于Java.lang.Class

列出一些常用的方法。

- getName() : 獲得類的完整名字

- getFields() : 獲得類的public類型的屬性

- getDeclaredFields() : 獲得類的所有屬性

- getMethods() : 獲得類的public類型的方法

- getDeclaredMethods() : 獲得類的所有方法

- getMethod(String name, Class[] parameterTypes) : 擷取類的特定方法(name參數指定方法名字,parameterTypes參數指定方法參數類型)

- getConstructors() : 獲得類的public類型的構造方法

- getConstructor(Class[] parameterTypes) : 獲得類的特定構造方法(parameterTypes參數指定構造方法的參數類型)

- newInstance() : 通過類的不帶參數的構造方法建立這個類的一個對象

如果想使用反射,有2個關鍵的部分

1.擷取Class對象

2.獲得對象執行個體

下面來介紹這兩個部分:

1.如何擷取Class對象

擷取某個類或某個對象所對應的Class對象的常用的3種方法

a) 使用Class類的靜态方法forName:       

  Class.forName("java.lang.String");

b) 使用類的.class文法: 

   String.class;

c) 使用對象的getClass()方法(java.lang.Object類中的方法): 

   String s = "aa"; 

   Class<?> clazz = s.getClass();

2.如何獲得對象執行個體

大家都知道獲得對象執行個體就是去new一個,其實就是調用對象的構造方法

這裡将調用構造方法參數的不同分為兩種類型:

a)調用無參數的構造方法:

1.調用Class對象的newInstance()方法:

Class<?> classType = ClassClass.forName("java.lang.String");

Object object = classTpye.newInstance();

         2.調用Class對象的Constructor對象的newInstance()方法,傳遞一個空的Class對象數組作為參數:

Constructor cons = classType.getConstructor(new Class[]{});  

Object object =cons.newInstance(new Object[]{});

b)調用有參數的構造方法:

1.調用Class對象的Constructor對象的newInstance()方法,傳遞一個可變長的Class對象數組作為參數,本例傳遞String,int兩個參數:

Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});

  Object object =

cons.newInstance(new Object[]{"hello",3});

下面來一個小Demo,由于過于簡單這裡就隻貼代碼了

這個demo簡單的實作了上面介紹的一些關于反射的用法,算是一個複習鞏固:

[java] view plain copy print?

class Person {  

    private long id;  

    private int age;  

    private String name;  

    public Person() {  

    }  

    public Person(String name, int age) {  

        this.name = name;  

        this.age = age;  

    @Override  

    public String toString() {  

        return "Name="+getName()+"  Age="+getAge()+"  Id="+getId();  

    public long getId() {  

        return id;  

    public void setId(long id) {  

        this.id = id;  

    public int getAge() {  

        return age;  

    public void setAge(int age) {  

    public String getName() {  

        return name;  

    public void setName(String name) {  

}  

很簡單的一個自定義類,兩個構造方法,和一些get,set方法,還有一個重寫的toString

下面是調用反射的main方法中的代碼,主要就是用反射的方法調用Person的帶參構造方法給age,name指派,在調用setId給id指派,最後調用toString方法列印出結果

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

        //擷取Person類的Class對象  

        Class<?> classType = Class.forName("Person");  

        //調用Person類的兩個參數構造方法生成對象  

        Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});  

        Object object = constructor.newInstance(new Object[]{"Dean",25});  

        //擷取setId方法  

        Method setId = classType.getMethod("setId", new Class[]{long.class});  

        //調用setId方法設定Id  

        setId.invoke(object, new Object[]{10});  

        //調用toString輸出結果  

        Method toString = classType.getMethod("toString", new Class[]{});  

        String result = (String) toString.invoke(object, new Object[]{});  

        System.out.println(result);  

輸出結果為:Name=Dean  Age=25  Id=10

最近正在看反射的視訊和資料,寫這個博文的目的就是對于學習的一個總結吧。

陸續可能會更新一些我總結的更深層的反射知識,希望大家支援