Method 類中 invoke方法的調用

          public void invokeActionHandler(ModelAndView mv , HttpServletRequest request) throws Exception{
                  String className 
          = mv.getClassName();
                  String methodName 
          = mv.getMethodName();
                  
          //load class
                  Class controllerClass = cache.loadClass(className);//== Class.forName(className);java反射機制,jvm加載lassName類
                  Class parentControllerClass = cache.loadClass(baseControllerClass);//class org.bluechant.mvc.controller.Controller
                  
          //load method參數1類,創建一個方法為setRequest參數為HttpServletRequest.class的方法與method = clazz.getDeclaredMethod(setRequest, HttpServletRequest.class);與HttpServletRequest的setRequest方法一致的方法.
                  Method setRequest = cache.loadMethod(parentControllerClass, "setRequest"new Class[] { HttpServletRequest.class });    //HttpServletRequest.class,java的反射機制得到自己的類,能夠擁有自己的方法值,(Method setRequest獲取成員函數)
                  Method setModelAndView = cache.loadMethod(parentControllerClass, "setModelAndView"new Class[] { ModelAndView.class });//org.bluechant.mvc.controller.Controller-setModelAndView@6024418  public void org.bluechant.mvc.controller.Controller.setModelAndView(org.bluechant.mvc.controller.ModelAndView)
                  Method targetMethod = cache.loadMethod(controllerClass, methodName, new Class[]{});
                  
          //buiid controller instance and invoke target method以上setRequest,setModelAndView,targetMethod都放在cache(hashMap中)
                  Object instance = controllerClass.newInstance();//加載className類
                  setRequest.invoke(instance, new Object[] { request });//對帶有指定參數的指定對象調用由此 Method 對象表示的基礎方法    
                  setModelAndView.invoke(instance, new Object[] { mv });//instance立即為原型指針
                  targetMethod.invoke(instance, new Object[]{});    
                  
          //調用instance類中targetMethod這個方法,Object[]{}這個作為參數..
                  
          //invoke根據實體獲得方法,添加所要造的參數,就是個找實例的方法克隆工廠,由Method獲得實例模型,由方法鍛造樣子,傳入參數得出想要結果
              }


          方法說明實例:


          }
          class ClassB{
           public ClassB(){
            System.out.println("this is ClassB");
           }

           public Object invokeMehton(Object owner,String methodName,Object[] args) throws Exception{
                            //根據methodName獲得owner里面的方法。args是對應方案參數。
            Class wnerClass=owner.getClass();
            Class[] argsClass=new Class[args.length];
            for(int i=0,j=args.length;i<j;i++){
              argsClass[i] = args[i].getClass();
            }
            Method method = ownerClass.getMethod(methodName, argsClass); 
            return method.invoke(owner, args);
           }
          }

          輸出為
          this is ClassB
          300
          outabccc

          說明c調用Class方法成功。


          import java.lang.reflect.Method;

          public class ClassA {
                  //ClassA里面有add、和StringAdd兩個不同方法。c是ClassB的Object
           ClassB c=new ClassB();
           public void add(Integer param1, Integer param2) {  
            
              System.out.println(param1 + param2);  
             
             }
           public void StringAdd(String abc){
            System.out.println("out"+abc);
           }
           public static void main(String[] args){
            ClassA a=new ClassA();
            try {
             a.c.invokeMehton(a, "add",new Object[] {new Integer(100),new Integer(200)});//反射調用方法add
             a.c.invokeMehton(a, "StringAdd",new Object[] {new String("abccc")});//反射調用方法StringAdd
            } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            
            
            
           }


           



          posted on 2012-05-24 18:54 youngturk 閱讀(606) 評論(0)  編輯  收藏 所屬分類: Java基礎java連接數據庫解析

          <2012年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          公告

          this year :
          1 jQuery
          2 freemarker
          3 框架結構
          4 口語英語

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          EJB學習

          Flex學習

          learn English

          oracle

          spring MVC web service

          SQL

          Struts

          生活保健

          解析文件

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 温州市| 开平市| 大庆市| 洪江市| 台中市| 高要市| 漠河县| 阳东县| 阜平县| 中牟县| 崇礼县| 金溪县| 老河口市| 松阳县| 华容县| 米易县| 特克斯县| 定远县| 漠河县| 文成县| 苏尼特左旗| 苗栗市| 安国市| 文山县| 监利县| 郎溪县| 莎车县| 洪雅县| 肥西县| 奎屯市| 左贡县| 建平县| 哈巴河县| 龙南县| 天峻县| 凤阳县| 隆回县| 西安市| 梅河口市| 武穴市| 英吉沙县|