根據指定類名建立執行個體(Java的反射機制)__Java

來源:互聯網
上載者:User

最近在用網路編程做一個小型伺服器,在做映射這一塊時遇到一個小問題:獲得handler後如何跳到對應的類中執行,即如何根據類名建立執行個體。

這裡有兩種形式:帶參數和不帶參數,下面是我的理解,是否完全正確有待考證:

1.對於不帶參數的情況,首先得到該類的Class對象,再調用newInstance方法即可得到空參數列表的執行個體,即:

Class c = Class.forName(className);//注意傳進來的是完全限定名,即帶上包名等

c.newInstance();

2.若要建立帶參數的執行個體,則需要在得到該類的Class對象後,獲得一個構造器,方法為Class.getConstructor(Class...parameterTypes),例如Class.getConstructor(String.class,OutputStream.class),表示一個參數清單類型為(String,OutputStream)的構造方法,傳回值為java.lang.reflect.Constructor,此類中有方法newInstance(Object...parameters),即對此構造器傳參數,得到對應的執行個體,下面是建立handler包中的一個類IndexHandler執行個體的例子,其中在IndexHandler類中有一構造方法為public IndexHandler(OutputStream outputStream,String request):

Class c = Class.forName("handler."+handler);java.lang.reflect.Constructor constructor = c.getConstructor(OutputStream.class,String.class);//順序不可變constructor.newInstance(outputStream,str);

由於傳回值屬於泛型,所以若不知道類的具體類名,是不能直接用其調用類中的方法的,如上例中不能用constructor.newInstance(outputStream,str).function();若要調用類中方法,可以用Class.getMethod或getMethods方法,其傳回值類型為Method,也是java.lang.reflect中的類,再調用方法invoke即可,具體例子如下:

Class<?> c = Class.forName(className);

Constructor<?> constructor = c.getConstructor(String.class); //假設類有一構造器className(String name)
Object o = constructor.newInstance("zhengjunyan"); //相當於new className("zhengjunyan")

Method method = c.getMethod("test",String.class); //假設類中有一個方法test(String s)
method.invoke(o,"zheng"); //即調用已建立的執行個體的方法test("zheng")

聯繫我們

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