精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官提問:什么是動態(tài)代理?

網(wǎng)絡(luò) 通信技術(shù)
據(jù)史料記載,代理這個(gè)詞最早出現(xiàn)在代理商這個(gè)行業(yè),所謂代理商,簡而言之,其實(shí)就是幫助企業(yè)或者老板打理生意,自己本身不做生產(chǎn)任何商品。

[[439196]]

本文轉(zhuǎn)載自微信公眾號「Java極客技術(shù)」,作者鴨血粉絲Tang。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號。

一、介紹

何謂代理?

據(jù)史料記載,代理這個(gè)詞最早出現(xiàn)在代理商這個(gè)行業(yè),所謂代理商,簡而言之,其實(shí)就是幫助企業(yè)或者老板打理生意,自己本身不做生產(chǎn)任何商品。

舉個(gè)例子,我們?nèi)セ疖囌举I票的時(shí)候,人少老板一個(gè)人還忙的過來,但是人一多的話,就會非常擁擠,于是就有了各種代售點(diǎn),我們可以從代售點(diǎn)買車票,從而加快老板的賣票速度。

代售點(diǎn)的出現(xiàn),可以說,很直觀的幫助老板提升了用戶購票體驗(yàn)。

站在軟件設(shè)計(jì)的角度,其實(shí)效果也是一樣的,采用代理模式的編程,能顯著的增強(qiáng)原有的功能和簡化方法調(diào)用方式。

在介紹動態(tài)代理之前,我們先來聊解靜態(tài)代理。

二、靜態(tài)代理

下面,我們以兩數(shù)相加為例,實(shí)現(xiàn)過程如下!

接口類

  1. public interface Calculator { 
  2.  
  3.     /** 
  4.      * 計(jì)算兩個(gè)數(shù)之和 
  5.      * @param num1 
  6.      * @param num2 
  7.      * @return 
  8.      */ 
  9.     Integer add(Integer num1, Integer num2); 

目標(biāo)對象

  1. public class CalculatorImpl implements Calculator { 
  2.  
  3.  
  4.     @Override 
  5.     public Integer add(Integer num1, Integer num2) { 
  6.         Integer result = num1 + num2; 
  7.         return result; 
  8.     } 

代理對象

  1. public class CalculatorProxyImpl implements Calculator { 
  2.  
  3.  
  4.     private Calculator calculator; 
  5.  
  6.  
  7.     @Override 
  8.     public Integer add(Integer num1, Integer num2) { 
  9.         //方法調(diào)用前,可以添加其他功能.... 
  10.         Integer result = calculator.add(num1, num2); 
  11.         //方法調(diào)用后,可以添加其他功能.... 
  12.         return result; 
  13.     } 
  14.  
  15.  
  16.     public CalculatorProxyImpl(Calculator calculator) { 
  17.         this.calculator = calculator; 
  18.     } 

測試類

  1. public class CalculatorProxyClient { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //目標(biāo)對象 
  5.         Calculator target = new CalculatorImpl(); 
  6.         //代理對象 
  7.         Calculator proxy = new CalculatorProxyImpl(target); 
  8.         Integer result = proxy.add(1,2); 
  9.         System.out.println("相加結(jié)果:" + result); 
  10.     } 

輸出結(jié)果

  1. 相加結(jié)果:3 

通過這種代理方式,最大的優(yōu)點(diǎn)就是:可以在不修改目標(biāo)對象的前提下,擴(kuò)展目標(biāo)對象的功能。

但也有缺點(diǎn):需要代理對象和目標(biāo)對象實(shí)現(xiàn)一樣的接口,因此,當(dāng)目標(biāo)對象擴(kuò)展新的功能時(shí),代理對象也要跟著一起擴(kuò)展,不易維護(hù)!

三、動態(tài)代理

動態(tài)代理,其實(shí)本質(zhì)也是為了解決上面當(dāng)目標(biāo)對象擴(kuò)展新功能時(shí),代理對象也需要跟著一起擴(kuò)展的痛點(diǎn)問題而生。

那它是怎么解決的呢?

以 JDK 為例,當(dāng)需要給某個(gè)目標(biāo)對象添加代理處理的時(shí)候,JDK 會在內(nèi)存中動態(tài)的構(gòu)建代理對象,從而實(shí)現(xiàn)對目標(biāo)對象的代理功能。

下面,我們還是以兩數(shù)相加為例,介紹具體的玩法!

3.1、JDK 中生成代理對象的玩法

創(chuàng)建接口

  1. public interface JdkCalculator { 
  2.  
  3.     /** 
  4.      * 計(jì)算兩個(gè)數(shù)之和 
  5.      * @param num1 
  6.      * @param num2 
  7.      * @return 
  8.      */ 
  9.     Integer add(Integer num1, Integer num2); 

目標(biāo)對象

  1. public class JdkCalculatorImpl implements JdkCalculator { 
  2.  
  3.     @Override 
  4.     public Integer add(Integer num1, Integer num2) { 
  5.         Integer result = num1 + num2; 
  6.         return result; 
  7.     } 

動態(tài)代理對象

  1. public class JdkProxyFactory { 
  2.  
  3.     /** 
  4.      * 維護(hù)一個(gè)目標(biāo)對象 
  5.      */ 
  6.     private Object target; 
  7.  
  8.     public JdkProxyFactory(Object target) { 
  9.         this.target = target; 
  10.     } 
  11.  
  12.     public Object getProxyInstance(){ 
  13.         Object proxyClassObj = Proxy.newProxyInstance(target.getClass().getClassLoader(), 
  14.                 target.getClass().getInterfaces(), 
  15.                 new InvocationHandler(){ 
  16.  
  17.                     @Override 
  18.                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  19.                         System.out.println("方法調(diào)用前,可以添加其他功能...."); 
  20.  
  21.                         // 執(zhí)行目標(biāo)對象方法 
  22.                         Object returnValue = method.invoke(target, args); 
  23.                         System.out.println("方法調(diào)用后,可以添加其他功能...."); 
  24.                         return returnValue; 
  25.                     } 
  26.                 }); 
  27.         return proxyClassObj; 
  28.     } 

測試類

  1. public class TestJdkProxy { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //目標(biāo)對象 
  5.         JdkCalculator target = new JdkCalculatorImpl(); 
  6.         System.out.println(target.getClass()); 
  7.         //代理對象 
  8.         JdkCalculator proxyClassObj = (JdkCalculator) new JdkProxyFactory(target).getProxyInstance(); 
  9.         System.out.println(proxyClassObj.getClass()); 
  10.         //執(zhí)行代理方法 
  11.         Integer result = proxyClassObj.add(1,2); 
  12.         System.out.println("相加結(jié)果:" + result); 
  13.     } 

輸出結(jié)果

  1. class com.example.java.proxy.jdk1.JdkCalculatorImpl 
  2. class com.sun.proxy.$Proxy0 
  3. 方法調(diào)用前,可以添加其他功能.... 
  4. 方法調(diào)用后,可以添加其他功能.... 
  5. 相加結(jié)果:3 

采用 JDK 技術(shù)動態(tài)創(chuàng)建interface實(shí)例的步驟如下:

  1. 1. 首先定義一個(gè) InvocationHandler 實(shí)例,它負(fù)責(zé)實(shí)現(xiàn)接口的方法調(diào)用 
  2. 2. 通過 Proxy.newProxyInstance() 創(chuàng)建 interface 實(shí)例,它需要 3 個(gè)參數(shù): 
  3.    (1)使用的 ClassLoader,通常就是接口類的 ClassLoader 
  4.    (2)需要實(shí)現(xiàn)的接口數(shù)組,至少需要傳入一個(gè)接口進(jìn)去; 
  5.    (3)用來處理接口方法調(diào)用的 InvocationHandler 實(shí)例。 
  6. 3. 將返回的 Object 強(qiáng)制轉(zhuǎn)型為接口 

動態(tài)代理實(shí)際上是 JVM 在運(yùn)行期動態(tài)創(chuàng)建class字節(jié)碼并加載的過程,它并沒有什么黑魔法技術(shù),把上面的動態(tài)代理改寫為靜態(tài)實(shí)現(xiàn)類大概長這樣:

  1. public class JdkCalculatorDynamicProxy implements JdkCalculator { 
  2.  
  3.     private InvocationHandler handler; 
  4.  
  5.     public JdkCalculatorDynamicProxy(InvocationHandler handler) { 
  6.         this.handler = handler; 
  7.     } 
  8.  
  9.     public void add(Integer num1, Integer num2) { 
  10.         handler.invoke( 
  11.            this, 
  12.            JdkCalculator.class.getMethod("add"Integer.class, Integer.class), 
  13.            new Object[] { num1, num2 }); 
  14.     } 

本質(zhì)就是 JVM 幫我們自動編寫了一個(gè)上述類(不需要源碼,可以直接生成字節(jié)碼)。

3.2、cglib 生成代理對象的玩法

除了 jdk 能實(shí)現(xiàn)動態(tài)的創(chuàng)建代理對象以外,還有一個(gè)非常有名的第三方框架:cglib,它也可以做到運(yùn)行時(shí)在內(nèi)存中動態(tài)生成一個(gè)子類對象從而實(shí)現(xiàn)對目標(biāo)對象功能的擴(kuò)展。

cglib 特點(diǎn)如下:

cglib 不僅可以代理接口還可以代理類,而 JDK 的動態(tài)代理只能代理接口

cglib 是一個(gè)強(qiáng)大的高性能的代碼生成包,它廣泛的被許多 AOP 的框架使用,例如我們所熟知的 Spring AOP,cglib 為他們提供方法的 interception(攔截)。

CGLIB包的底層是通過使用一個(gè)小而快的字節(jié)碼處理框架ASM,來轉(zhuǎn)換字節(jié)碼并生成新的類,速度非???。

在使用 cglib 之前,我們需要添加依賴包,如果你已經(jīng)有spring-core的jar包,則無需引入,因?yàn)閟pring中包含了cglib。

  1. <dependency> 
  2.     <groupId>cglib</groupId> 
  3.     <artifactId>cglib</artifactId> 
  4.     <version>3.2.5</version> 
  5. </dependency> 

 

下面,我們還是以兩數(shù)相加為例,介紹具體的玩法!

  1. public interface CglibCalculator { 
  2.  
  3.     /** 
  4.      * 計(jì)算兩個(gè)數(shù)之和 
  5.      * @param num1 
  6.      * @param num2 
  7.      * @return 
  8.      */ 
  9.     Integer add(Integer num1, Integer num2); 

目標(biāo)對象

  1. public class CglibCalculatorImpl implements CglibCalculator { 
  2.  
  3.  
  4.     @Override 
  5.     public Integer add(Integer num1, Integer num2) { 
  6.         Integer result = num1 + num2; 
  7.         return result; 
  8.     } 

動態(tài)代理對象

  1. public class CglibProxyFactory implements MethodInterceptor { 
  2.  
  3.     /** 
  4.      * 維護(hù)一個(gè)目標(biāo)對象 
  5.      */ 
  6.     private Object target; 
  7.  
  8.     public CglibProxyFactory(Object target) { 
  9.         this.target = target; 
  10.     } 
  11.  
  12.     /** 
  13.      * 為目標(biāo)對象生成代理對象 
  14.      * @return 
  15.      */ 
  16.     public Object getProxyInstance() { 
  17.         //工具類 
  18.         Enhancer en = new Enhancer(); 
  19.         //設(shè)置父類 
  20.         en.setSuperclass(target.getClass()); 
  21.         //設(shè)置回調(diào)函數(shù) 
  22.         en.setCallback(this); 
  23.         //創(chuàng)建子類對象代理 
  24.         return en.create(); 
  25.     } 
  26.  
  27.     @Override 
  28.     public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { 
  29.         System.out.println("方法調(diào)用前,可以添加其他功能...."); 
  30.  
  31.         // 執(zhí)行目標(biāo)對象方法 
  32.         Object returnValue = method.invoke(target, args); 
  33.         System.out.println("方法調(diào)用后,可以添加其他功能...."); 
  34.         return returnValue; 
  35.     } 

測試類

  1. public class TestCglibProxy { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //目標(biāo)對象 
  5.         CglibCalculator target = new CglibCalculatorImpl(); 
  6.         System.out.println(target.getClass()); 
  7.         //代理對象 
  8.         CglibCalculator proxyClassObj = (CglibCalculator) new CglibProxyFactory(target).getProxyInstance(); 
  9.         System.out.println(proxyClassObj.getClass()); 
  10.         //執(zhí)行代理方法 
  11.         Integer result = proxyClassObj.add(1,2); 
  12.         System.out.println("相加結(jié)果:" + result); 
  13.     } 

輸出結(jié)果

  1. class com.example.java.proxy.cglib1.CglibCalculatorImpl 
  2. class com.example.java.proxy.cglib1.CglibCalculatorImpl$$EnhancerByCGLIB$$3ceadfe4 
  3. 方法調(diào)用前,可以添加其他功能.... 
  4. 方法調(diào)用后,可以添加其他功能.... 
  5. 相加結(jié)果:3 

將 cglib 生成的代理類改寫為靜態(tài)實(shí)現(xiàn)類大概長這樣:

  1. public class CglibCalculatorImplByCGLIB extends CglibCalculatorImpl implements Factory { 
  2.      
  3.  
  4.     private static final MethodInterceptor methodInterceptor; 
  5.  
  6.     private static final Method method; 
  7.          
  8.  
  9.     public final Integer add(Integer var1, Integer var2) { 
  10.         return methodInterceptor.intercept(this, method, new Object[]{var1, var2}, methodProxy); 
  11.     } 
  12.  
  13.     //.... 

其中,攔截思路與 JDK 類似,都是通過一個(gè)接口方法進(jìn)行攔截處理!

在上文中咱們還介紹到了,cglib 不僅可以代理接口還可以代理類,下面我們試試代理類。

  1. public class CglibCalculatorClass { 
  2.  
  3.     /** 
  4.      * 計(jì)算兩個(gè)數(shù)之和 
  5.      * @param num1 
  6.      * @param num2 
  7.      * @return 
  8.      */ 
  9.     public Integer add(Integer num1, Integer num2) { 
  10.         Integer result = num1 + num2; 
  11.         return result; 
  12.     } 

測試類

  1. public class TestCglibProxyClass { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //目標(biāo)對象 
  5.         CglibCalculatorClass target = new CglibCalculatorClass(); 
  6.         System.out.println(target.getClass()); 
  7.         //代理對象 
  8.         CglibCalculatorClass proxyClassObj = (CglibCalculatorClass) new CglibProxyFactory(target).getProxyInstance(); 
  9.         System.out.println(proxyClassObj.getClass()); 
  10.         //執(zhí)行代理方法 
  11.         Integer result = proxyClassObj.add(1,2); 
  12.         System.out.println("相加結(jié)果:" + result); 
  13.     } 

輸出結(jié)果

  1. class com.example.java.proxy.cglib1.CglibCalculatorClass 
  2. class com.example.java.proxy.cglib1.CglibCalculatorClass$$EnhancerByCGLIB$$e68ff36c 
  3. 方法調(diào)用前,可以添加其他功能.... 
  4. 方法調(diào)用后,可以添加其他功能.... 
  5. 相加結(jié)果:3 

四、靜態(tài)織入

在上文中,我們介紹的代理方案都是在代碼運(yùn)行時(shí)動態(tài)的生成class文件達(dá)到動態(tài)代理的目的。

回到問題的本質(zhì),其實(shí)動態(tài)代理的技術(shù)目的,主要為了解決靜態(tài)代理模式中當(dāng)目標(biāo)接口發(fā)生了擴(kuò)展,代理類也要跟著一遍變動的問題,避免造成了工作傷的繁瑣和復(fù)雜。

在 Java 生態(tài)里面,還有一個(gè)非常有名的第三方代理框架,那就是AspectJ,AspectJ通過特定的編譯器可以將目標(biāo)類編譯成class字節(jié)碼的時(shí)候,在方法周圍加上業(yè)務(wù)邏輯,從而達(dá)到靜態(tài)代理的效果。

采用AspectJ進(jìn)行方法植入,主要有四種:

  • 方法調(diào)用前攔截
  • 方法調(diào)用后攔截
  • 調(diào)用方法結(jié)束攔截
  • 拋出異常攔截

使用起來也非常簡單,首先是在項(xiàng)目中添加AspectJ編譯器插件。

  1. <plugin> 
  2.     <groupId>org.codehaus.mojo</groupId> 
  3.     <artifactId>aspectj-maven-plugin</artifactId> 
  4.     <version>1.5</version> 
  5.     <executions> 
  6.         <execution> 
  7.             <goals> 
  8.                 <goal>compile</goal> 
  9.                 <goal>test-compile</goal> 
  10.             </goals> 
  11.         </execution> 
  12.     </executions> 
  13.     <configuration> 
  14.         <source>1.6</source> 
  15.         <target>1.6</target> 
  16.         <encoding>UTF-8</encoding> 
  17.         <complianceLevel>1.6</complianceLevel> 
  18.         <verbose>true</verbose> 
  19.         <showWeaveInfo>true</showWeaveInfo> 
  20.     </configuration> 
  21. </plugin> 

 

 

然后,編寫一個(gè)方法,準(zhǔn)備進(jìn)行代理。

  1. @RequestMapping({"/hello"}) 
  2. public String hello(String name) { 
  3.     String result = "Hello World"
  4.     System.out.println(result); 
  5.     return result; 

編寫代理配置類

  1. @Aspect 
  2. public class ControllerAspect { 
  3.  
  4.     /*** 
  5.      * 定義切入點(diǎn) 
  6.      */ 
  7.     @Pointcut("execution(* com.example.demo.web..*.*(..))"
  8.     public void methodAspect(){} 
  9.  
  10.     /** 
  11.      * 方法調(diào)用前攔截 
  12.      */ 
  13.     @Before("methodAspect()"
  14.     public void before(){ 
  15.         System.out.println("代理 -> 調(diào)用方法執(zhí)行之前......"); 
  16.     } 
  17.  
  18.     /** 
  19.      * 方法調(diào)用后攔截 
  20.      */ 
  21.     @After("methodAspect()"
  22.     public void after(){ 
  23.         System.out.println("代理 -> 調(diào)用方法執(zhí)行之后......"); 
  24.     } 
  25.  
  26.     /** 
  27.      * 調(diào)用方法結(jié)束攔截 
  28.      */ 
  29.     @AfterReturning("methodAspect()"
  30.     public void afterReturning(){ 
  31.         System.out.println("代理 -> 調(diào)用方法結(jié)束之后......"); 
  32.     } 
  33.  
  34.     /** 
  35.      * 拋出異常攔截 
  36.      */ 
  37.     @AfterThrowing("methodAspect()"
  38.     public void afterThrowing() { 
  39.         System.out.println("代理 -> 調(diào)用方法異常......"); 
  40.     } 

編譯后,hello方法會變成這樣。

  1. @RequestMapping({"/hello"}) 
  2. public String hello(Integer name) throws SQLException { 
  3.     JoinPoint var2 = Factory.makeJP(ajc$tjp_0, this, this, name); 
  4.  
  5.     Object var7; 
  6.     try { 
  7.         Object var5; 
  8.         try { 
  9.             //調(diào)用before 
  10.             Aspectj.aspectOf().doBeforeTask2(var2); 
  11.             String result = "Hello World"
  12.             System.out.println(result); 
  13.             var5 = result; 
  14.         } catch (Throwable var8) { 
  15.             Aspectj.aspectOf().after(var2); 
  16.             throw var8; 
  17.         } 
  18.         //調(diào)用after 
  19.         Aspectj.aspectOf().after(var2); 
  20.         var7 = var5; 
  21.     } catch (Throwable var9) { 
  22.         //調(diào)用拋出異常 
  23.         Aspectj.aspectOf().afterthrowing(var2); 
  24.         throw var9; 
  25.     } 
  26.     //調(diào)用return 
  27.     Aspectj.aspectOf().afterRutuen(var2); 
  28.     return (String)var7; 

很顯然,代碼被AspectJ編譯器修改了,AspectJ并不是動態(tài)的在運(yùn)行時(shí)生成代理類,而是在編譯的時(shí)候就植入代碼到class文件。

由于是靜態(tài)織入的,所以性能相對來說比較好!

五、小結(jié)

看到上面的介紹靜態(tài)織入方案,跟我們現(xiàn)在使用Spring AOP的方法極其相似,可能有的同學(xué)會發(fā)出疑問,我們現(xiàn)在使用的Spring AOP動態(tài)代理,到底是動態(tài)生成的還是靜態(tài)織入的呢?

實(shí)際上,Spring AOP代理是對JDK代理和CGLIB代理做了一層封裝,同時(shí)引入了AspectJ中的一些注解@pointCut、@after,@before等等,本質(zhì)是使用的動態(tài)代理技術(shù)。

總結(jié)起來就三點(diǎn):

如果目標(biāo)是接口的話,默認(rèn)使用 JDK 的動態(tài)代理技術(shù);

如果目標(biāo)是類的話,使用 cglib 的動態(tài)代理技術(shù);

引入了AspectJ中的一些注解@pointCut、@after,@before,主要是為了簡化使用,跟AspectJ的關(guān)系并不大;

那為什么Spring AOP不使用AspectJ這種靜態(tài)織入方案呢?

雖然AspectJ編譯器非常強(qiáng),性能非常高,但是只要目標(biāo)類發(fā)生了修改就需要重新編譯,主要原因可能還是AspectJ的編譯器太過于復(fù)雜,還不如動態(tài)代理來的省心!

六、參考

1、Java三種代理模式:靜態(tài)代理、動態(tài)代理和cglib代理

 

2、Java 動態(tài)代理作用是什么?

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2022-09-29 07:30:57

數(shù)據(jù)庫索引字段

2023-07-05 08:17:38

JDK動態(tài)代理接口

2021-09-07 10:44:33

Java 注解開發(fā)

2024-02-22 15:36:23

Java內(nèi)存模型線程

2023-12-06 09:10:28

JWT微服務(wù)

2021-02-19 10:02:57

HTTPSJava安全

2025-07-15 02:15:00

MySQL索引回表

2020-08-17 07:40:19

消息隊(duì)列

2021-04-19 18:56:58

大數(shù)字符串運(yùn)算

2022-04-29 08:17:38

RPC遠(yuǎn)程代理代理模式

2023-12-20 14:35:37

Java虛擬線程

2020-08-06 07:49:57

List元素集合

2025-08-08 08:10:08

2021-05-12 08:20:53

開發(fā)

2025-03-10 07:05:07

2025-08-15 07:55:20

2024-04-15 00:01:00

STWJava垃圾

2022-01-05 09:55:26

asynawait前端

2024-01-11 08:12:20

重量級監(jiān)視器

2021-08-24 08:05:41

泛型類型擦除Class
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美在线黄色| 99久久人爽人人添人人澡| 国产片一区二区| 91久久夜色精品国产网站| 欧美精品一区二区成人| 亚洲精品蜜桃乱晃| 在线播放国产精品二区一二区四区| 99亚洲国产精品| 男人天堂一区二区| 日韩av午夜在线观看| 欧美美女18p| 91久久免费视频| 日本一区二区中文字幕| 亚洲一区在线观看视频| 欧美伦理一区二区| 国产视频手机在线| 性欧美videos另类喷潮| 精品国内亚洲在观看18黄| 国产精品手机在线观看| 久久久久毛片| 欧美性猛交xxxx久久久| www.亚洲一区二区| www.中文字幕久久久| 国产精品538一区二区在线| 欧美一级在线播放| 久久久久无码国产精品| 日韩1区在线| 国产视频精品久久久| 中文字幕丰满乱码| 黑人巨大亚洲一区二区久| 亚洲综合免费观看高清完整版在线| 日韩国产精品一区二区| 日日躁夜夜躁白天躁晚上躁91| 美女视频第一区二区三区免费观看网站| 久久久久久一区二区三区| 免费看一级黄色| 深夜福利久久| 日韩精品视频中文在线观看| 苍井空张开腿实干12次| 97欧美成人| 欧洲一区二区三区免费视频| 欧美a v在线播放| 欧美v亚洲v| 亚洲美女区一区| 亚洲一区二区三区欧美| 国产系列在线观看| 久久综合av免费| 精品欧美国产| 色欲av伊人久久大香线蕉影院| 国产精品伊人色| 亚洲xxxx3d| 国产视频一区二区三| 久久精品国产网站| 国产精品偷伦免费视频观看的| 69亚洲精品久久久蜜桃小说| 亚洲综合三区| 日本久久亚洲电影| 国产成人无码一区二区在线播放| 99热精品在线| 欧美在线亚洲在线| 黄色免费av网站| 久久精品一本| 国产精品爽爽ⅴa在线观看| 亚洲av人无码激艳猛片服务器| 三级久久三级久久| 国产精品美女免费| 一区二区三区亚洲视频| 韩国成人福利片在线播放| 亚洲sss综合天堂久久| 97人妻精品一区二区三区动漫| 国内成人免费视频| 成人免费观看网站| 天堂a中文在线| 久久久久久久性| 亚洲精品在线免费| 国产一二三区在线观看| 亚洲曰韩产成在线| 男人用嘴添女人下身免费视频| 小早川怜子影音先锋在线观看| 欧美性猛交xxxx久久久| 国产精品一区二区小说| 久久久久久久久久久久电影| 精品美女一区二区| 91av在线免费| 久久美女视频| 欧美黑人视频一区| 丰满人妻老熟妇伦人精品| 青青草国产精品亚洲专区无| 91在线视频精品| 色网站免费观看| 欧美国产精品v| 99热这里只有精品免费| 捆绑调教日本一区二区三区| 91久久奴性调教| av在线网站免费观看| 精品亚洲自拍| 日韩一区二区欧美| 国产午夜免费视频| 免费观看久久久4p| 国产精品v欧美精品v日韩| 久久久久久女乱国产| 亚洲美女在线一区| 免费在线观看毛片网站| 日本一区二区三区播放| 亚洲精品一区二区在线| 深夜福利影院在线观看| 久久中文字幕一区二区三区| 91在线播放国产| 国产精品免费观看| 一区二区欧美国产| 超碰在线播放91| 久久中文资源| 米奇精品一区二区三区在线观看| 精品人妻无码一区二区性色| 国产成人精品三级| 欧美日韩在线一二三| 宅男在线观看免费高清网站| 在线精品亚洲一区二区不卡| 杨幂一区二区国产精品| 欧美先锋资源| 欧美在线激情视频| 亚洲AV无码一区二区三区性| 中文字幕av资源一区| 2022亚洲天堂| 红杏aⅴ成人免费视频| 日韩在线国产精品| 极品国产91在线网站| 成人免费视频播放| 青青草影院在线观看| 国产成人免费精品| 亚洲欧美激情四射在线日| 国产一级中文字幕| 任你操这里只有精品| 网曝91综合精品门事件在线| 色综合久久悠悠| 国产麻豆免费观看| 国产精品嫩草99a| 看欧美ab黄色大片视频免费| 亚洲小说图片| 91av视频在线播放| 人妻无码中文字幕免费视频蜜桃| 一区二区三区在线视频播放| 国产5g成人5g天天爽| 国产精品成人av| 成人一区二区电影| 麻豆视频网站在线观看| 制服丝袜亚洲色图| 91ts人妖另类精品系列| 久久丁香综合五月国产三级网站 | 一级黄色在线观看| 91免费视频网| 日本精品www| 神马电影久久| 国产精品精品一区二区三区午夜版| 欧美人体大胆444www| 日韩欧中文字幕| 一级黄色性视频| 蜜臀av国产精品久久久久| 亚洲a∨一区二区三区| 韩日精品一区| 日韩亚洲第一页| 99久久久国产精品无码免费| 亚洲黄色小视频| 午夜免费福利影院| 国产精品入口| 欧美日韩精品久久| 秋霞国产精品| 日韩在线不卡视频| 国产极品久久久| 午夜久久久久久| 91成年人网站| 久久精品久久99精品久久| 992tv成人免费观看| 都市激情亚洲欧美| 国产成人亚洲综合| 免费黄色在线看| 精品黑人一区二区三区久久| 国产免费观看av| 国产精品婷婷午夜在线观看| 制服下的诱惑暮生| 一本一本久久| 亚洲欧洲精品一区二区| 综合欧美亚洲| 欧美中文字幕在线播放| 午夜在线小视频| 精品国产亚洲一区二区三区在线观看| 亚洲精品国产精品乱码| 中文字幕不卡在线播放| 精品伦一区二区三区| 久久午夜av| 欧美性受黑人性爽| 日韩av字幕| 国产一区欧美二区三区| 黄色大片在线| 伊人伊成久久人综合网小说| 国产片在线播放| 精品久久久久久国产91| 少妇视频一区二区| 91在线精品一区二区三区| 亚洲 激情 在线| 亚洲经典视频在线观看| 亚洲一区在线免费| 欧美美女啪啪| 亚洲一区国产精品| 天堂久久午夜av| 久久免费高清视频| 免费黄色在线看| 亚洲欧美三级在线| 高潮毛片7777777毛片| 欧美三级一区二区| 亚洲第一精品在线观看 | 日韩hd视频在线观看| 国产精品爽爽久久久久久| 欧美日韩亚洲系列| 欧美三级免费看| 国产精品人人做人人爽人人添| 天堂www中文在线资源| 精品一区二区三区日韩| 国产性xxxx18免费观看视频| 欧美私人啪啪vps| 中日韩在线视频| 国产亚洲一区| 精品无人乱码一区二区三区的优势 | 黄频在线免费观看| 91精品国产综合久久福利软件 | 男女男精品视频网| a在线视频观看| 国产精品啊v在线| 黄色免费高清视频| 久久中文字幕二区| 日韩三级电影网站| 美女久久99| 国产一区在线免费观看| 亚洲天堂av资源在线观看| 国产在线高清精品| 国产成人精品一区二区三区视频 | 97精品国产97久久久久久久久久久久| 国产精品熟女一区二区不卡| 麻豆传媒一区二区三区| 日韩欧美在线免费观看视频| 国产精品入口| 欧美 日韩 国产一区| 国产精品久久久一区二区| 国产免费黄色一级片| 亚洲香蕉网站| 男人天堂a在线| 伊人精品视频| 成人午夜精品久久久久久久蜜臀| 欧美午夜不卡| 黄色三级中文字幕| 亚洲黄页一区| 国产精品国产亚洲精品看不卡| 伊人久久久大香线蕉综合直播 | 欧美日韩精品一区| 综合国产视频| 日本一区二区三区视频在线播放| 亚洲春色h网| 日韩精品极品视频在线观看免费| 国产一区二区三区探花| 午夜老司机精品| 国产精品久久久久久| 免费观看国产视频在线| 国产精品s色| 日本午夜激情视频| 亚洲在线电影| 婷婷激情四射五月天| 久久国产精品一区二区| 三级黄色片免费看| 成人国产精品免费观看| 亚洲精品成人无码熟妇在线| 中文字幕av一区二区三区高 | 亚洲精品美女91| 久久婷婷五月综合色国产香蕉| 久久精品午夜| 男生操女生视频在线观看| 国产69精品久久777的优势| xxxxxx黄色| 国产日本欧美一区二区| 亚洲xxxx3d动漫| 亚洲成va人在线观看| 在线观看日本网站| 欧美高清性hdvideosex| 国产91麻豆视频| 在线视频中文亚洲| 日本在线观看大片免费视频| 66m—66摸成人免费视频| 成人精品动漫| 国产精品美女xx| 成人网18免费网站| 国产成人永久免费视频| 久久精品女人| 无码人妻少妇色欲av一区二区| av男人天堂一区| 成人精品一二三区| 亚洲不卡一区二区三区| 一本到在线视频| 亚洲福利视频网站| 日本中文字幕在线2020| 97碰碰碰免费色视频| 青娱乐极品盛宴一区二区| 国产一区二区久久久| 999国产精品永久免费视频app| 免费看欧美一级片| 毛片av一区二区| 韩国无码一区二区三区精品| 亚洲视频一区在线| 国产黄网在线观看| 精品国产乱码久久久久久免费 | av小说天堂网| 亚洲一区999| 91九色porn在线资源| 91精品久久久久久久久| 亚洲另类春色校园小说| 日本一级黄视频| 紧缚奴在线一区二区三区| 日韩片在线观看| 一区二区成人在线| 97人妻精品一区二区三区动漫| 亚洲色图综合网| 91桃色在线观看| 亚洲在线一区二区| 国产精品91一区二区三区| 成人免费毛片播放| 91女厕偷拍女厕偷拍高清| 久久精品国产亚洲AV无码男同| 欧美日韩国产一级| 国产青青草在线| 69视频在线播放| 国产精品丝袜在线播放| a级片一区二区| 国产曰批免费观看久久久| 三级黄色片在线观看| 欧洲生活片亚洲生活在线观看| 亚洲区小说区图片区| 久久久久久久久爱| 亚洲精品一二三**| 国产美女视频免费| 国精产品一区一区三区mba桃花| 黄色裸体一级片| 欧美日韩视频在线观看一区二区三区| 久草福利在线| 国产精品高潮在线| 精品国产乱码久久久久久蜜坠欲下 | 欧美在线观看一区二区| 日韩在线无毛| 青草成人免费视频| 蜜桃一区二区三区| 91看片就是不一样| 亚洲国产精品二十页| 中文字幕一区二区三区波野结 | 精品欧美久久久| 性欧美1819sex性高清大胸| 91在线视频导航| 国产精品大片| 国产精品无码在线| 欧美性20hd另类| 国产在线观看高清视频| 国产精品久久久久7777婷婷| 欧美三级情趣内衣| 亚洲综合欧美在线| 一区二区三区在线免费| 亚洲男人第一天堂| 91极品视频在线| 国产精品手机在线播放| 亚洲成人福利在线观看| 国产精品午夜久久| 国产熟女一区二区丰满| 欧美精品aaa| 久久99国产精品视频| 亚洲视频在线观看一区二区三区| 国产精品色哟哟| 国产成人麻豆精品午夜在线 | 国产亚洲欧美视频| 欧美日韩卡一| 国产精品69久久久| 久久久久久麻豆| 亚洲熟女乱色一区二区三区久久久| 北条麻妃99精品青青久久| 成人三级av在线| 777米奇影视第四色| 亚洲三级电影全部在线观看高清| www.四虎在线观看| 青青精品视频播放| 2023国产精品久久久精品双| 少妇激情一区二区三区视频| 色悠悠久久综合| 91麻豆免费在线视频| 久久久久久久久久久久久久久久av | 蜜臀av免费观看| 一区二区三区加勒比av| 国产最新视频在线| 成人av免费在线看| 日韩精品亚洲专区| 免费一级a毛片夜夜看| 亚洲欧美综合图区| 综合伊人久久| 一本色道久久亚洲综合精品蜜桃| 亚洲777理论| 美女黄视频在线观看| 鲁鲁视频www一区二区|