【Java反射機制】_反射應用——取得類的結構筆記

來源:互聯網
上載者:User

【Java反射機制】_反射應用——取得類的結構筆記

本章目標:
可以使用反射取得實現的全部介面
可以使用反射取得一個類所繼承的父類
可以使用反射取得一個類的全部構造方法
可以使用反射取得一個類的全部方法
可以使用反射取得一個類的全部屬性

具體內容

反射機制的深入————取得類的結構

在實際開發中,以上的程式就是反射應該最多的地方,當然,反射機制所提供的功能遠遠不止如此,還可以通過反射得到一個類的完整結構,那麼這樣就使用到java.lang.reflect包中的以下幾個類:

Constructor:表示類中的構造方法
Field:表示類中的屬性
Method:表示類中的方法

這三個類都是AccessibleObject類的子類

操作類:

package org.lxh.demo15;interface China{    //定義China介面    public static final String NATIONAL = "China";    //定義全域常量    public static final String AUTHOR = "牛兒吃草";    //定義全域常量    public void sayChina();                //無參的,沒有傳回值的方法    public String sayHello(String name,int age);    //定義有兩個參數的方法,並返回內容}public class Person implements China{    private String name;    private int age;    public Person(){//無參構造            }    public Person(String name){        this.name = name;    //設定name屬性        }    public Person(String name,int age){        this(name);        this.age = age;        }    public void sayChina(){        System.out.println("作者:"+AUTHOR+",國籍:"+NATIONAL);    }    public String SayHello(String name,int age){        return name+",你好!我今年:"+age+"歲了!";    }    public void SetName(String name){        this.name = name;    }    public void setAge(int age){        this.age = age;    }    public String getName(){        return this.name;    }    public int getAge(){        return this.age;    }}

3.1、取得類所實現的全部介面

要想取得一個類所實現的全部介面,則必須使用Class類中的getInterfaces()方法。此方法定義如下:
public Class[] getInterfaces()
此方法返回一個Class類的對象數組,之後就可以直接利用Class類中的getName()方法輸出即可。

如果要想取得一個類所實現的全部介面,可以使用Class類中的
public Class<?>[] getInterfaces()

因為一個類可以同時實現多個介面,所以在此處將以一個數組的形式返回實現的全部介面。

package org.lxh.demo15.classinfodemo;public class GetInterfaceDemo{    public static void main(String args[]){        Class<?> c1 = null;    //聲明Class對象        try{            c1 = Class.forName("org.lxh.demo15.Person");    //執行個體化對象        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Class<?> c[] = c1.getInterfaces();        for(int i=0;i<c.length;i++){            System.out.println("實現的介面名稱:"+c[i].getName());//輸出介面名稱        }    }}
3.2、取得類所繼承的父類

格式:
public Class<? super T> getSuperclass()
此方法返回的是Class執行個體地,和之前得到介面一樣,可以通過getName()方法取得名稱。

取得父類

package org.lxh.demo15.classinfodemo;public class GetSuperClassDemo{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Class<?> c2 = c1.getSuperclass();    //取得父類        System.out.println("父類名稱:"+c2.getName());    }}

3.3、取得類中的全部構造方法

package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;public class GetConstructorDemo01{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Constructor<?> con[] = c1.getConstructors();        for(int i=0;i<con.length;i++){            System.out.println("構造方法:"+con[i]);    //輸出構造,直接列印        }    }}

Constructor類中存在了以下的幾個方法:

取得修飾符:public int getModifiers()
取得方法名稱:public String getName()
取得參數的類型:public Class<?>[] getParameterTypes()

package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;public class GetConstructorDemo02{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Constructor<?> con[] = c1.getConstructors();        for(int i=0;i<con.length;i++){            Class<?> p[] = con[i].getParameterTypes();    //得到構造方法中的全部參數            System.out.print("構造方法:");    //輸出構造,直接列印            System.out.print(con[i].getModifiers()+" ");    //得到修飾符            System.out.print(con[i].getName());    //取得構造方法的名字            System.out.print("(");            for(int j=0;j<p.length;j++){                System.out.print(p[j].getName()+"arg"+i);                if(j<p.length-1){                    System.out.print(",");    //輸出","                }            }            System.out.println("){}");        }    }}

此時,在操作之後,發現,所有的修飾符變成了數字.

下面還原修飾符

public static String toString(int mod)
int mo = con[i].getModifiers();            //取出許可權
System.out.print(Modifier.toString(mo)+" ");    //還原許可權

下面修改如下:

package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;import java.lang.reflect.Modifier;public class GetConstructorDemo03{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Constructor<?> con[] = c1.getConstructors();        for(int i=0;i<con.length;i++){            Class<?> p[] = con[i].getParameterTypes();    //得到構造方法中的全部參數            System.out.print("構造方法:");    //輸出構造,直接列印            int mo = con[i].getModifiers();            //取出許可權            System.out.print(Modifier.toString(mo)+" ");    //還原許可權            System.out.print(con[i].getName());    //取得構造方法的名字            System.out.print("(");            for(int j=0;j<p.length;j++){                System.out.print(p[j].getName()+"arg"+i);                if(j<p.length-1){                    System.out.print(",");    //輸出","                }            }            System.out.println("){}");        }    }}

3.4、取得類中的方法

public Method[] getDeclaredMethods() throws SecurityException    //輸出本類的全部方法
public Method[] getMethods() throws SecurityException    //輸出本類的全部方法

方法操作:
取得全部的傳回值:public Class<?> getReturnType()
取得全部的參數:public Class<?>[] getParameterTypes()
取得修飾符:public int getModifiers()
取得異常資訊:public Class<?>[] getExceptionTypes()

package org.lxh.demo15.classinfodemo ;import java.lang.reflect.Method ;    // 匯入構造方法的包import java.lang.reflect.Modifier ;    // 匯入構造方法的包public class GetMethodDemo{    public static void main(String args[]){        Class<?> c1 = null ;        // 聲明Class對象        try{            c1 = Class.forName("org.lxh.demo15.Person") ;    // 執行個體化對象        }catch(ClassNotFoundException e){            e.printStackTrace() ;        }        Method m[] = c1.getMethods() ;    // 取得全部方法        for(int i=0;i<m.length;i++){            Class<?> r = m[i].getReturnType() ;    // 得到傳回值類型            Class<?> p[] = m[i].getParameterTypes() ;    // 取得全部參數的類型            int xx = m[i].getModifiers() ;    // 得到修飾符            System.out.print(Modifier.toString(xx) + " ") ;    // 輸出修飾符            System.out.print(r + " ") ;            System.out.print(m[i].getName()) ;            System.out.print("(") ;            for(int j=0;j<p.length;j++){                System.out.print(p[j].getName() + " " + "arg" + j) ;                if(j<p.length-1){                    System.out.print(",") ;                }            }            Class<?> ex[] = m[i].getExceptionTypes() ;    // 取出異常            if(ex.length>0){                System.out.print(") throws ") ;            }else{                System.out.print(")") ;            }            for(int j=0;j<ex.length;j++){                System.out.print(ex[j].getName()) ;                if(j<p.length-1){                    System.out.print(",") ;                }            }            System.out.println() ;        }    }};
3.5、取得類中的屬性

得到實現的介面或父類中的公用屬性:public Field[] getFields() throws SecurityException
得到本類中的全部屬性:public Field[] getDeclaredFields() throws SecurityException

package org.lxh.demo15.classinfodemo ;import java.lang.reflect.Field ;    // 匯入構造方法的包import java.lang.reflect.Modifier ;    // 匯入構造方法的包public class GetFieldDemo{    public static void main(String args[]){        Class<?> c1 = null ;        // 聲明Class對象        try{            c1 = Class.forName("org.lxh.demo15.Person") ;    // 執行個體化對象        }catch(ClassNotFoundException e){            e.printStackTrace() ;        }        {    // 本類屬性            Field f[] = c1.getDeclaredFields() ;    // 取得本類中的屬性            for(int i=0;i<f.length;i++){                Class<?> r = f[i].getType() ;    // 得到屬性類型                int mo = f[i].getModifiers() ;    // 得到修飾符的數字                String priv = Modifier.toString(mo) ; // 還原修飾符                System.out.print("本類屬性:") ;                System.out.print(priv + " ") ;                    System.out.print(r.getName() + " ") ;    // 得到屬性類型                System.out.print(f[i].getName()) ;    // 輸出屬性名稱                System.out.println(" ;") ;            }        }        {    // 公用屬性            Field f[] = c1.getFields() ;    // 取得本類中的公用屬性            for(int i=0;i<f.length;i++){                Class<?> r = f[i].getType() ;    // 得到屬性類型                int mo = f[i].getModifiers() ;    // 得到修飾符的數字                String priv = Modifier.toString(mo) ; // 還原修飾符                System.out.print("公用屬性:") ;                System.out.print(priv + " ") ;                    System.out.print(r.getName() + " ") ;    // 得到屬性類型                System.out.print(f[i].getName()) ;    // 輸出屬性名稱                System.out.println(" ;") ;            }        }    }};

聯繫我們

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