最近在用網路編程做一個小型伺服器,在做映射這一塊時遇到一個小問題:獲得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")