国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

面試題:增強(qiáng)一個(gè)對象的方法的三種方式

233jl / 3353人閱讀

摘要:面試題增強(qiáng)一個(gè)對象的方法的三種方式繼承使用這種方式必須滿足的條件是被增強(qiáng)的方法的所在類能被繼承,并且這個(gè)對象已經(jīng)明確知道。所以創(chuàng)建一個(gè)類繼承重寫了父類的方法增強(qiáng)了,變成飛了。。。

面試題:增強(qiáng)一個(gè)對象的方法的三種方式 1. 繼承

使用這種方式必須滿足的條件是:被增強(qiáng)的方法的所在類能被繼承,并且這個(gè)對象已經(jīng)明確知道。

舉例:

有一個(gè)接口Person,里面有一個(gè)方法run()

package com.itzhouq.demo1;

public interface Person {
    public void run();
}

類NormalPerson實(shí)現(xiàn)了這個(gè)接口Person

package com.itzhouq.demo1;

public class NormalPerson implements Person {

    @Override
    public void run() {
        System.out.println("走.......");
    }
}

現(xiàn)在的需求是,使用繼承方式增強(qiáng)NomalPerson中的方法run()

這里需要被增強(qiáng)的方法是run(),所在的類NomalPerson可以被繼承并且已經(jīng)明確。

所以創(chuàng)建一個(gè)類Superson繼承NormalPerson

package com.itzhouq.demo1;

public class Superson extends NormalPerson {
    //重寫了父類NormalPerson的方法
    @Override
    public void run() {
        super.run();
        System.out.println("增強(qiáng)了,變成飛了。。。");
    }
}

類Superson通過對父類NormalPerson的run()方法進(jìn)行重寫,實(shí)現(xiàn)對run()方法的增強(qiáng)。

測試

package com.itzhouq.demo1;
  
  import org.junit.Test;
  
  /*
   * 增強(qiáng)一個(gè)對象的方法之一:繼承方式
   */
  public class Demo {
      
      @Test
      public void test() {
          NormalPerson p = new NormalPerson();
          p.run();//走.......
      }
      
      //需求:對普通人的run方法進(jìn)行增強(qiáng),由走變成飛----增強(qiáng)一個(gè)對象的方法
      //用繼承來實(shí)現(xiàn)需求:創(chuàng)建一個(gè)類繼承NormalPerson
      @Test
      public void test2() {
          Superson superson = new Superson();
          superson.run();
  //        走.......
  //        增強(qiáng)了,變成飛了。。。
      }
      
  }
2. 裝飾者模式

裝飾者模式實(shí)現(xiàn)對方法的增強(qiáng),不需要知道被增強(qiáng)的方法run()所在的類是哪個(gè)類,只需要知道這個(gè)類實(shí)現(xiàn)了哪個(gè)接口即可。

條件:

裝飾者和被裝飾者需要實(shí)現(xiàn)同一個(gè)類

裝飾者有被裝飾者的引用

接口:

package com.itzhouq.demo2;

public interface Person {
    public void run();
}

需要被增強(qiáng)的方法run()

package com.itzhouq.demo2;

public class NormalPerson implements Person {

    @Override
    public void run() {
        System.out.println("走.......");
    }
}

這里被裝飾者就是run()方法所在的類

創(chuàng)建一個(gè)裝飾者類,實(shí)現(xiàn)run()所在類,實(shí)現(xiàn)的接口Person

package com.itzhouq.demo2;

public class Superson implements Person {
    //被裝飾者的引用
    private NormalPerson p;
    public Superson(NormalPerson p) {
        this.p = p;
    }
    
    @Override
    public void run() {
        //這個(gè)是被裝飾者以前的方法
        p.run();
        //增強(qiáng)
        System.out.println("增強(qiáng)了,變成飛。。。。");
    }
}

測試

package com.itzhouq.demo2;
  
  import org.junit.Test;
  /*
   * 增強(qiáng)一個(gè)對象的方法之二:裝飾者方式
   */
  public class Demo {
      
      @Test
      public void test() {
          NormalPerson p = new NormalPerson();
          p.run();//走.......
      }
      
      //需求:對普通人的run方法進(jìn)行增強(qiáng),由走變成飛
      //假裝不知道接口的實(shí)現(xiàn)類NormalPerson,但是要對普通人的run方法進(jìn)行增強(qiáng)
      //不知道實(shí)現(xiàn)類就無法使用繼承的方式進(jìn)行增強(qiáng)
      //使用裝飾者解決這樣的問題:
          //條件1:裝飾者()和被裝飾者()實(shí)現(xiàn)同一個(gè)接口Person
          //條件2:裝飾者里面有被裝飾者的引用         在我出生的時(shí)候,你把你給我,我對你進(jìn)行增強(qiáng)
      
      @Test
      public void test2() {
          NormalPerson p = new NormalPerson();
          Superson superson = new Superson(p);
          superson.run();
  //        走.......
  //        增強(qiáng)了,變成飛。。。。
  
      }
  }
3. 動(dòng)態(tài)代理

通過一張圖回顧動(dòng)態(tài)代理

動(dòng)態(tài)代理的條件:必須知道要被代理的類/對象是誰,這里要被代理的類是NoemalPerson

Proxy.newProxyInstance(ClassLoader loader, Class[] interface, InvocationHander h);
//返回一個(gè)指定接口的代理類實(shí)現(xiàn)

接口person,這里再加一個(gè)方法sleep

package com.itzhouq.demo3;

public interface Person {
    public void run();
    public String sleep();
}

實(shí)現(xiàn)類NomalPerson

package com.itzhouq.demo3;

public class NormalPerson implements Person {

    @Override
    public void run() {
        System.out.println("走.......");
    }

    @Override
    public String sleep() {
        System.out.println("睡覺了。。。");
        return "sleep";
    }
}

使用動(dòng)態(tài)代理增強(qiáng)

package com.itzhouq.demo3;
  
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  
  import org.junit.Test;
  
  public class Demo {
      @Test
      public void test() {
          NormalPerson p = new NormalPerson();
          p.run();//走.......
      }
      
      //需求:使用動(dòng)態(tài)代理的方式對普通人進(jìn)行增強(qiáng)
      //JDK提供的類和方法可以給咱們動(dòng)態(tài)的生成代理對象/增強(qiáng)對象
      
      /*
       * 參數(shù)概述:固定的
       *     參數(shù)1:和要被增強(qiáng)的對象,一樣的,類加載器
       *     參數(shù)2:和要被增強(qiáng)的對象一樣的接口
       *             1 根據(jù)指定的傳遞接口返回一個(gè)該接口下的實(shí)例
       *             2 傳遞的接口里面的方法就是可以被增強(qiáng)的所有方法
       *     參數(shù)3:所有的增強(qiáng)業(yè)務(wù)的邏輯實(shí)現(xiàn)(方法)
       */
      @Test
      public void test1() {
          NormalPerson p = new NormalPerson();
          Person proxyPerson = (Person) Proxy.newProxyInstance(
                  p.getClass().getClassLoader(), 
                  p.getClass().getInterfaces(),
                  new InvocationHandler() {
                      
                      /*
                       *     參數(shù)概述:固定的
                       *     參數(shù)1:不用管,永遠(yuǎn)是固定值     代理對象的類型
                       *     參數(shù)2:要被增強(qiáng)的方法
                       *     參數(shù)3:要被增強(qiáng)的方法運(yùn)行過程中需要的參數(shù)
                       */
                      @Override    //invoke里面是所有的增強(qiáng)業(yè)務(wù)的邏輯代碼
                      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                          //讓以前的方法執(zhí)行
                              //參數(shù)1:本身應(yīng)該執(zhí)行這個(gè)方法的對象
                              //參數(shù)2:執(zhí)行這個(gè)方法需要的參數(shù)
                          Object value = method.invoke(p, args);
                          //原來方法的返回值
                          System.out.println(value);
                          // 寫增強(qiáng)業(yè)務(wù)邏輯
                          System.out.println("增強(qiáng)了,變成飛了。。。");
                          //最終的返回值,誰調(diào)用返回給誰
                          return "abcd";
                      }
                  });
          proxyPerson.run();//執(zhí)行接口中的每一個(gè)需要增強(qiáng)的方法,invoke都會(huì)執(zhí)行一遍,執(zhí)行的內(nèi)容就是針對該方法的增強(qiáng)
  //        走.......
  //        增強(qiáng)了,變成飛了。。。
          String value = proxyPerson.sleep();
          System.out.println(value);
  //        睡覺了。。。
  //        sleep
  //        增強(qiáng)了,變成飛了。。。
  //        abcd
      }
  }
4. 擴(kuò)展:使用動(dòng)態(tài)代理方式統(tǒng)一字符集編碼

新建Web項(xiàng)目,新建一個(gè)index.jsp。在JSP中寫兩個(gè)表單,分別為post和get方式提交。后臺(tái)通過Servlet接收到前臺(tái)輸入的username,打印在控制臺(tái)會(huì)亂碼。

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


    
用戶名:

用戶名:

Servlet

package com.itzhouq.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println(username);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

為解決這個(gè)問題使用過濾器,在過濾器中使用動(dòng)態(tài)代理方式解決

新建一個(gè)過濾器MyFilter.java,并在xml文件中配置過濾的資源為全部資源

web.xml


    MyFilter
    com.itzhouq.filter.MyFilter


    MyFilter
    /*

MyFilter

package com.itzhouq.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class MyFilter implements Filter {
    public MyFilter() {
    }
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //要增強(qiáng)的方法:request.getparameter
        //被代理的對象:request
        HttpServletRequest request = (HttpServletRequest)req;
        
        //動(dòng)態(tài)的生成代理對象
        HttpServletRequest hsr = (HttpServletRequest) Proxy.newProxyInstance(
                request.getClass().getClassLoader(), 
                request.getClass().getInterfaces(), 
                new InvocationHandler() {
                    
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //1. 判斷是否是要增強(qiáng)的方法getParameter
                        if("getParameter".equals(method.getName())) {
                            //知道getParameter使用的是哪個(gè)提交方式
                            String m = request.getMethod();
                            //判斷是get還是post
                            if("get".equalsIgnoreCase(m)) {
                                //    以前方法調(diào)用后的亂碼
                                String s = (String)method.invoke(request, args);
                                // 增強(qiáng)---解決亂碼
                                s = new String(s.getBytes("iso8859-1"),"utf-8");
                                return s;
                            }
                            if("post".equalsIgnoreCase(m)) {
                                request.setCharacterEncoding("utf-8");
                                return method.invoke(request, args);
                            }
                        }
                        
                        //    如果是別的方法
                        return method.invoke(request, args);
                    }
                });
        
        chain.doFilter(hsr, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }
}

后臺(tái)Servlet接收到的username不在亂碼。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74395.html

相關(guān)文章

  • 一道面試引發(fā)思考

    摘要:下面我們來使用面向?qū)ο箢悎D這里就不再畫了首先面試題中所提到的我們都可以看成類,比如停車場是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場的一道面試題(大概): 1、一個(gè)停車場,車輛入場時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號(hào))以及各層車位的車位余量3、停車場一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    Apollo 評(píng)論0 收藏0
  • 一道面試引發(fā)思考

    摘要:下面我們來使用面向?qū)ο箢悎D這里就不再畫了首先面試題中所提到的我們都可以看成類,比如停車場是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場的一道面試題(大概): 1、一個(gè)停車場,車輛入場時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號(hào))以及各層車位的車位余量3、停車場一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    soasme 評(píng)論0 收藏0
  • 一道面試引發(fā)思考

    摘要:下面我們來使用面向?qū)ο箢悎D這里就不再畫了首先面試題中所提到的我們都可以看成類,比如停車場是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場的一道面試題(大概): 1、一個(gè)停車場,車輛入場時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號(hào))以及各層車位的車位余量3、停車場一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    Backache 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<