java反射的學習

來源:互聯網
上載者:User

標籤:路徑   cat   成員   tty   for   ati   rem   父類   方法   

 

1.類的 類類型(ClassType)

類的類類型可以用來做很多事,我們可以通過它擷取到類的名稱,類的路徑,類的成員變數,類的方法等等,還可以通過它獲得類的執行個體化對象。

我們可以通過 類名.class 來得到類的類類型,如下面的 c1

Class c1 = ReflectDemo.class;

 

我們可以通過類的執行個體對象得到類的類類型

ReflectDemo demo1 = new ReflectDemo();Class c2 = demo1.getClass();

 

還可以通過類的包路徑加類名獲得類的類類型

Class c3 = Class.forName("reflectdemo.ReflectDemo");

值得注意的是,每個類只有一個類類型,也就是說上面的 c1, c2 , c3 指向的是同一個對象。

 

在開頭也說了,類的類類型同樣可以得到類的執行個體,所以兩者可以相互得到。

類自身,類的類類型 和 類的執行個體對象 的關係如:

2.通過類的類類型擷取類的成員變數以及方法

 自己寫了一個方法,通過傳入某個類的執行個體對象,就能得到該類的方法。

 其中 getMethod() 方法是擷取類中所有public方法,包括父類的 public 方法;getDeclareMethod()方法可以擷取本類中聲明的所有方法,不論許可權

    public static void getClassMethods(Object obj){        Class c = obj.getClass();     //擷取類類型        Method []ms = c.getMethods();  //擷取類中所有的public方法,包括父類中的方法        Method []ms2 = c.getDeclaredMethods();  ////擷取該類自己聲明的所有方法,不論許可權        Field []fields = c.getFields();   //擷取類中public級成員變數        for(Field f:fields){            String fieldType = f.getType().getSimpleName();   //獲得成員變數類型            String fieldName = f.getName();    //獲得成員變數名            System.out.println(fieldType+" "+fieldName);        }                for(Method m:ms){            String type = m.getReturnType().getName();   //方法的傳回值類型            System.out.print(type+" ");            String methodName=m.getName();        //方法名            System.out.print(methodName+"(");            Class []params = m.getParameterTypes();   //方法中 參數的類類型 元組                        for(Class param:params){                String parName = param.getName();   //從參數類類型中得到參數名                System.out.print(parName+" ");            }            System.out.println(");");        }            }

 

 3.通過反射來操作方法

除了上面通過getMethods()和getDeclaredMethods()擷取方法數組之外,還可以通過getMethod()和getDeclaredMethod()來對單個方法進行尋找。

這時就要注意,想要定位一個方法,必須要傳入正確的方法名以及參數類類型才行。如下:

public class ReflectDemo2 {        public void print(){        System.out.println("a+b");    }        public String add(String a,String b){        return a+b;    }        public int add(int a,int b){        return a+b;    }}

 

我們想要擷取對應的方法就要進行如下操作:

        ReflectDemo2 demo=new ReflectDemo2();        Class c=ReflectDemo2.class;        try {            //通過傳入的方法名稱和參數類類型來獲得某一確定方法的類類型//            Method m1=c.getMethod("add", new Class[]{int.class,int.class});  //第一個參數為方法名,後面既可以傳入一個類類型數組,也可以單獨地傳入類類型            Method m1=c.getMethod("add",int.class,int.class);             Object obj = m1.invoke(demo, 10,20);   //通過invoke()來執行方法,要傳入類的執行個體對象以及對應參數的值             System.out.println(obj);                        Method m2=c.getMethod("print");   //如果沒有參數要傳入,直接輸入方法名即可            m2.invoke(demo);   //如果方法沒有傳回值,可以不用擷取            } catch (Exception e) {                e.printStackTrace();            }            }

結果和平常使用類的執行個體對象調用方法的結果是一樣的。

 

待編輯。。

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.