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

看AspectJ在Android中的強(qiáng)勢插入

移動(dòng)開發(fā) Android
AspectJ實(shí)際上是對(duì)AOP編程思想的一個(gè)實(shí)踐,當(dāng)然,除了AspectJ以外,還有很多其它的AOP實(shí)現(xiàn),例如ASMDex,但目前最好、最方便的,依然是AspectJ。

什么是AOP

AOP是Aspect Oriented Programming的縮寫,即『面向切面編程』。它和我們平時(shí)接觸到的OOP都是編程的不同思想,OOP,即『面向?qū)ο缶幊獭唬岢氖菍⒐δ苣K化,對(duì)象化,而AOP的思想,則不太一樣,它提倡的是針對(duì)同一類問題的統(tǒng)一處理,當(dāng)然,我們?cè)趯?shí)際編程過程中,不可能單純的安裝AOP或者OOP的思想來編程,很多時(shí)候,可能會(huì)混合多種編程思想,大家也不必要糾結(jié)該使用哪種思想,取百家之長,才是正道。

那么AOP這種編程思想有什么用呢,一般來說,主要用于不想侵入原有代碼的場景中,例如SDK需要無侵入的在宿主中插入一些代碼,做日志埋點(diǎn)、性能監(jiān)控、動(dòng)態(tài)權(quán)限控制、甚至是代碼調(diào)試等等。

AspectJ

AspectJ實(shí)際上是對(duì)AOP編程思想的一個(gè)實(shí)踐,當(dāng)然,除了AspectJ以外,還有很多其它的AOP實(shí)現(xiàn),例如ASMDex,但目前***、最方便的,依然是AspectJ。

在Android項(xiàng)目中使用AspectJ

AOP的用處非常廣,從Spring到Android,各個(gè)地方都有使用,特別是在后端,Spring中已經(jīng)使用的非常方便了,而且功能非常強(qiáng)大,但是在Android中,AspectJ的實(shí)現(xiàn)是略閹割的版本,并不是所有功能都支持,但對(duì)于一般的客戶端開發(fā)來說,已經(jīng)完全足夠用了。

在Android上集成AspectJ實(shí)際上是比較復(fù)雜的,不是一句話就能compile,但是,鄙司已經(jīng)給大家把這個(gè)問題解決了,大家現(xiàn)在直接使用這個(gè)SDK就可以很方便的在Android Studio中使用AspectJ了。Github地址如下:

https://github.com/HujiangTec...

另外一個(gè)比較成功的使用AOP的庫是Jake大神的Hugo:

https://github.com/JakeWharto...

接入說明

首先,需要在項(xiàng)目根目錄的build.gradle中增加依賴:

  1. classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8' 

完整代碼如下:

  1. buildscript { 
  2.     repositories { 
  3.         jcenter() 
  4.     } 
  5.     dependencies { 
  6.         classpath 'com.android.tools.build:gradle:2.3.0-beta2' 
  7.         classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8' 
  8.  
  9.         // NOTE: Do not place your application dependencies here; they belong 
  10.         // in the individual module build.gradle files 
  11.     } 
  12.  

然后再主項(xiàng)目或者庫的build.gradle中增加AspectJ的依賴:

  1. compile 'org.aspectj:aspectjrt:1.8.9' 

同時(shí)在build.gradle中加入AspectJX模塊:

  1. apply plugin: 'android-aspectjx' 

這樣就把整個(gè)Android Studio中的AspectJ的環(huán)境配置完畢了,如果在編譯的時(shí)候,遇到一些『can't determine superclass of missing type xxxxx』這樣的錯(cuò)誤,請(qǐng)參考項(xiàng)目README中關(guān)于excludeJarFilter的使用。

  1. aspectjx { 
  2.     //includes the libs that you want to weave 
  3.     includeJarFilter 'universal-image-loader''AspectJX-Demo/library' 
  4.  
  5.     //excludes the libs that you don't want to weave 
  6.     excludeJarFilter 'universal-image-loader' 
  7.  

AspectJ入門

我們通過一段簡單的代碼來了解下基本的使用方法和功能,新建一個(gè)AspectTest類文件,代碼如下:

  1. @Aspect 
  2. public class AspectTest { 
  3.  
  4.     private static final String TAG = "xuyisheng"
  5.  
  6.     @Before("execution(* android.app.Activity.on**(..))"
  7.     public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable { 
  8.         String key = joinPoint.getSignature().toString(); 
  9.         Log.d(TAG, "onActivityMethodBefore: " + key); 
  10.     } 
  11.  

在類的最開始,我們使用@Aspect注解來定義這樣一個(gè)AspectJ文件,編譯器在編譯的時(shí)候,就會(huì)自動(dòng)去解析,并不需要主動(dòng)去調(diào)用AspectJ類里面的代碼。

我的原始代碼很簡單:

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.     } 
  8.  

通過這種方式編譯后,我們來看下生成的代碼是怎樣的。AspectJ的原理實(shí)際上是在編譯的時(shí)候,根據(jù)一定的規(guī)則解析,然后插入一些代碼,通過aspectjx生成的代碼,會(huì)在Build目錄下:  

 

通過反編譯工具查看下生成內(nèi)容:   

 

我們可以發(fā)現(xiàn),在onCreate的最前面,插入了一行AspectJ的代碼。這個(gè)就是AspectJ的主要功能,拋開AOP的思想來說,我們想做的,實(shí)際上就是『在不侵入原有代碼的基礎(chǔ)上,增加新的代碼』。

AspectJ之Join Points

Join Points,簡稱JPoints,是AspectJ的核心思想之一,它就像一把刀,把程序的整個(gè)執(zhí)行過程切成了一段段不同的部分。例如,構(gòu)造方法調(diào)用、調(diào)用方法、方法執(zhí)行、異常等等,這些都是Join Points,實(shí)際上,也就是你想把新的代碼插在程序的哪個(gè)地方,是插在構(gòu)造方法中,還是插在某個(gè)方法調(diào)用前,或者是插在某個(gè)方法中,這個(gè)地方就是Join Points,當(dāng)然,不是所有地方都能給你插的,只有能插的地方,才叫Join Points。

AspectJ之Pointcuts

Join Points和Pointcuts的區(qū)別實(shí)際上很難說,我也不敢說我理解的一定對(duì),但這些都是概念上的內(nèi)容,并不影響我們?nèi)ナ褂谩?/p>

Pointcuts,在我理解,實(shí)際上就是在Join Points中通過一定條件選擇出我們所需要的Join Points,所以說,Pointcuts,也就是帶條件的Join Points,作為我們需要的代碼切入點(diǎn)。

AspectJ之Advice

又來一個(gè)Advice,Advice其實(shí)是***理解的,也就是我們具體插入的代碼,以及如何插入這些代碼。我們最開始舉的那個(gè)例子,里面就是使用的最簡單的Advice——Before。類似的還有After、Around,我們后面來講講他們的區(qū)別。

AspectJ之切點(diǎn)語法

我們以前面的Demo來看下最簡單的AspectJ語法:

  1. @Before("execution(* android.app.Activity.on**(..))"
  2. public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable { 
  3.  

這里會(huì)分成幾個(gè)部分,我們依次來看:

  • @Before:Advice,也就是具體的插入點(diǎn)
  • execution:處理Join Point的類型,例如call、execution
  • ( android.app.Activity.on*(..)):這個(gè)是最重要的表達(dá)式,***個(gè)『*』表示返回值,『*』表示返回值為任意類型,后面這個(gè)就是典型的包名路徑,其中可以包含『*』來進(jìn)行通配,幾個(gè)『*』沒區(qū)別。同時(shí),這里可以通過『&&、||、!』來進(jìn)行條件組合。()代表這個(gè)方法的參數(shù),你可以指定類型,例如android.os.Bundle,或者(..)這樣來代表任意類型、任意個(gè)數(shù)的參數(shù)。
  • public void onActivityMethodBefore:實(shí)際切入的代碼。

這里還有一些匹配規(guī)則,可以作為示例來進(jìn)行講解: 

表達(dá)式 含義
java.lang.String 匹配String類型
java.*.String 匹配java包下的任何“一級(jí)子包”下的String類型,如匹配java.lang.String,但不匹配java.lang.ss.String
java..* 匹配java包及任何子包下的任何類型,如匹配java.lang.String、java.lang.annotation.Annotation
java.lang.*ing 匹配任何java.lang包下的以ing結(jié)尾的類型
java.lang.Number+ 匹配java.lang包下的任何Number的自類型,如匹配java.lang.Integer,也匹配java.math.BigInteger
參數(shù) 含義
() 表示方法沒有任何參數(shù)
(..) 表示匹配接受任意個(gè)參數(shù)的方法
(..,java.lang.String) 表示匹配接受java.lang.String類型的參數(shù)結(jié)束,且其前邊可以接受有任意個(gè)參數(shù)的方法
(java.lang.String,..) 表示匹配接受java.lang.String類型的參數(shù)開始,且其后邊可以接受任意個(gè)參數(shù)的方法
(*,java.lang.String) 表示匹配接受java.lang.String類型的參數(shù)結(jié)束,且其前邊接受有一個(gè)任意類型參數(shù)的方法

AspectJ實(shí)例

Before、After

這兩個(gè)Advice應(yīng)該是使用的最多的,所以,我們先來看下這兩個(gè)Advice的實(shí)例,首先看下Before和After。

  1. @Before("execution(* com.xys.aspectjxdemo.MainActivity.on*(android.os.Bundle))"
  2. public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable { 
  3.     String key = joinPoint.getSignature().toString(); 
  4.     Log.d(TAG, "onActivityMethodBefore: " + key); 
  5.  
  6. @After("execution(* com.xys.aspectjxdemo.MainActivity.on*(android.os.Bundle))"
  7. public void onActivityMethodAfter(JoinPoint joinPoint) throws Throwable { 
  8.     String key = joinPoint.getSignature().toString(); 
  9.     Log.d(TAG, "onActivityMethodAfter: " + key); 
  10.  

經(jīng)過上面的語法解釋,現(xiàn)在看這個(gè)應(yīng)該很好理解了,我們來看下編譯后的類: 

 

 

 

我們可以看見,在原始代碼的基礎(chǔ)上,增加了Before和After的代碼,Log也能被正確的插入并打印出來。

Around

Before和After其實(shí)還是很好理解的,也就是在Pointcuts之前和之后,插入代碼,那么Around呢,從字面含義上來講,也就是在方法前后各插入代碼,是的,他包含了Before和After的全部功能,代碼如下:

  1. @Around("execution(* com.xys.aspectjxdemo.MainActivity.testAOP())"
  2. public void onActivityMethodAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { 
  3.     String key = proceedingJoinPoint.getSignature().toString(); 
  4.     Log.d(TAG, "onActivityMethodAroundFirst: " + key); 
  5.     proceedingJoinPoint.proceed(); 
  6.     Log.d(TAG, "onActivityMethodAroundSecond: " + key); 
  7.  

其中,proceedingJoinPoint.proceed()代表執(zhí)行原始的方法,在這之前、之后,都可以進(jìn)行各種邏輯處理。

原始代碼:

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.         testAOP(); 
  8.     } 
  9.  
  10.     public void testAOP() { 
  11.         Log.d("xuyisheng""testAOP"); 
  12.     } 
  13.  

我們先來看下編譯后的代碼: 

 

 

 

我們可以發(fā)現(xiàn),Around確實(shí)實(shí)現(xiàn)了Before和After的功能,但是要注意的是,Around和After是不能同時(shí)作用在同一個(gè)方法上的,會(huì)產(chǎn)生重復(fù)切入的問題。

自定義Pointcuts

自定義Pointcuts可以讓我們更加精確的切入一個(gè)或多個(gè)指定的切入點(diǎn)。

首先,我們需要自定義一個(gè)注解類,例如——DebugTool.java:

  1. /** 
  2.  * 自定義AOP注解 
  3.  * <p> 
  4.  * Created by xuyisheng on 17/1/12. 
  5.  */ 
  6.  
  7. @Retention(RetentionPolicy.CLASS) 
  8. @Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) 
  9. public @interface DebugTool { 
  10.  

然后在需要插入代碼的地方使用這個(gè)注解:

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.         testAOP(); 
  8.     } 
  9.  
  10.     @DebugTool 
  11.     public void testAOP() { 
  12.         Log.d("xuyisheng""testAOP"); 
  13.     } 
  14.  

***,我們來創(chuàng)建自己的切入文件。

  1. @Pointcut("execution(@com.xys.aspectjxdemo.DebugTool * *(..))"
  2. public void DebugToolMethod() { 
  3.  
  4. @Before("DebugToolMethod()"
  5. public void onDebugToolMethodBefore(JoinPoint joinPoint) throws Throwable { 
  6.     String key = joinPoint.getSignature().toString(); 
  7.     Log.d(TAG, "onDebugToolMethodBefore: " + key); 
  8.  

先定義Pointcut,并申明要監(jiān)控的方法名,***,在Before或者其它Advice里面添加切入代碼,即可完成切入。

編譯好的代碼如下: 

 

 

 

通過這種方式,我們可以非常方便的監(jiān)控指定的Pointcut,從而增加監(jiān)控的粒度。

call和execution

在AspectJ的切入點(diǎn)表達(dá)式中,我們前面都是使用的execution,實(shí)際上,還有一種類型——call,那么這兩種語法有什么區(qū)別呢,我們來試驗(yàn)下就知道了。

被切代碼依然很簡單:

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.         testAOP(); 
  8.     } 
  9.  
  10.     public void testAOP() { 
  11.         Log.d("xuyisheng""testAOP"); 
  12.     } 
  13.  

先來看execution,代碼如下:

  1. @Before("execution(* com.xys.aspectjxdemo.MainActivity.testAOP(..))"
  2. public void methodAOPTest(JoinPoint joinPoint) throws Throwable { 
  3.     String key = joinPoint.getSignature().toString(); 
  4.     Log.d(TAG, "methodAOPTest: " + key); 
  5.  

編譯之后的代碼如下所示: 

 

 

 

再來看下call,代碼如下:

  1. @Before("call(* com.xys.aspectjxdemo.MainActivity.testAOP(..))"
  2. public void methodAOPTest(JoinPoint joinPoint) throws Throwable { 
  3.     String key = joinPoint.getSignature().toString(); 
  4.     Log.d(TAG, "methodAOPTest: " + key); 
  5.  

編譯之后的代碼如下所示: 

 

 

其實(shí)對(duì)照起來看就一目了然了,execution是在被切入的方法中,call是在調(diào)用被切入的方法前或者后。

對(duì)于Call來說:

  1. Call(Before) 
  2. Pointcut{ 
  3.     Pointcut Method 
  4. Call(After)  

對(duì)于Execution來說:

  1. Pointcut{ 
  2.   execution(Before) 
  3.     Pointcut Method 
  4.   execution(After) 
  5.  

切入點(diǎn)過濾與withincode

除了前面提到的call和execution,比較常用的還有一個(gè)withincode。這個(gè)語法通常來進(jìn)行一些切入點(diǎn)條件的過濾,作更加精確的切入控制。我們可以參考下面這個(gè)例子:

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.         testAOP1(); 
  8.         testAOP2(); 
  9.     } 
  10.  
  11.     public void testAOP() { 
  12.         Log.d("xuyisheng""testAOP"); 
  13.     } 
  14.  
  15.     public void testAOP1() { 
  16.         testAOP(); 
  17.     } 
  18.  
  19.     public void testAOP2() { 
  20.         testAOP(); 
  21.     } 
  22.  

testAOP1()和testAOP2()都調(diào)用了testAOP()方法,但是,現(xiàn)在想在testAOP2()方法調(diào)用testAOP()方法的時(shí)候,才切入代碼,那么這個(gè)時(shí)候,就需要使用到Pointcut和withincode組合的方式,來精確定位切入點(diǎn)。

  1. // 在testAOP2()方法內(nèi) 
  2. @Pointcut("withincode(* com.xys.aspectjxdemo.MainActivity.testAOP2(..))"
  3. public void invokeAOP2() { 
  4.  
  5. // 調(diào)用testAOP()方法的時(shí)候 
  6. @Pointcut("call(* com.xys.aspectjxdemo.MainActivity.testAOP(..))"
  7. public void invokeAOP() { 
  8.  
  9. // 同時(shí)滿足前面的條件,即在testAOP2()方法內(nèi)調(diào)用testAOP()方法的時(shí)候才切入 
  10. @Pointcut("invokeAOP() && invokeAOP2()"
  11. public void invokeAOPOnlyInAOP2() { 
  12.  
  13. @Before("invokeAOPOnlyInAOP2()"
  14. public void beforeInvokeAOPOnlyInAOP2(JoinPoint joinPoint) { 
  15.     String key = joinPoint.getSignature().toString(); 
  16.     Log.d(TAG, "onDebugToolMethodBefore: " + key); 
  17.  

我們?cè)賮砜聪戮幾g后的代碼: 

 

 

 

我們可以看見,只有在testAOP2()方法中被插入了代碼,這就做到了精確條件的插入。

異常處理AfterThrowing

AfterThrowing是一個(gè)比較少見的Advice,他用于處理程序中未處理的異常,記住,這點(diǎn)很重要,是未處理的異常,具體原因,我們等會(huì)看反編譯出來的代碼就知道了。我們隨手寫一個(gè)異常,代碼如下:

  1. public void testAOP() { 
  2.     View view = null
  3.     view.animate(); 
  4.  

然后使用AfterThrowing來進(jìn)行AOP代碼的編寫:

  1. @AfterThrowing(pointcut = "execution(* com.xys.aspectjxdemo.*.*(..))", throwing = "exception"
  2. public void catchExceptionMethod(Exception exception) { 
  3.     String message = exception.toString(); 
  4.     Log.d(TAG, "catchExceptionMethod: " + message); 
  5.  

這段代碼很簡單,同樣是使用我們前面類似的表達(dá)式,但是這里是為了處理異常,所以,使用了*.*來進(jìn)行通配,在異常中,我們執(zhí)行一行日志,編譯好的代碼如下: 

 

 

 

我們可以看見com.xys.aspectjxdemo包下的所有方法都被加上了try catch,同時(shí),在catch中,被插入了我們切入的代碼,但是***,他依然會(huì)throw e,也就是說,這個(gè)異常已經(jīng)會(huì)被拋出去,崩潰依舊是會(huì)發(fā)生的。同時(shí),如果你的原始代碼中已經(jīng)try catch了,那么同樣也無法處理,具體原因,我們看一個(gè)反編譯的代碼: 

 

 

 

可以看見,實(shí)際上,原始代碼的catch中,又被套了一層try catch,所以,e.printStackTrace()被try catch,也就不會(huì)再有異常發(fā)生了,也就無法切入了。

AspectJX使用案例

目前鄙司的很多項(xiàng)目都已經(jīng)使用了這套AOP方案,例如基于AOP的動(dòng)態(tài)權(quán)限管理、基于AOP的業(yè)務(wù)數(shù)據(jù)埋點(diǎn)、基于AOP的性能監(jiān)測系統(tǒng)等等。

現(xiàn)在已經(jīng)開源了一部分基于AOP的動(dòng)態(tài)權(quán)限管理的源碼,但由于需要?jiǎng)冸x業(yè)務(wù)代碼,所以后面會(huì)更加完善這功能代碼,大家可以繼續(xù)關(guān)注,github地址如下所示:

https://github.com/firefly112...

其它的AOP項(xiàng)目陸續(xù)開源中,大家可以持續(xù)關(guān)注~

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2012-12-10 20:01:42

惠普安騰Integrity

2011-05-26 15:22:57

Android Activity

2009-12-15 14:29:54

RIP路由協(xié)議

2014-04-23 11:01:12

幣看比特幣應(yīng)用手機(jī)APP

2010-01-04 14:35:52

軟交換設(shè)備

2011-08-10 09:12:44

SQL Server插入圖像存儲(chǔ)過程

2017-02-06 13:31:19

Android樣式繼承關(guān)系

2011-05-25 10:32:19

SQLite

2021-09-07 10:55:36

SQLitePythonRust

2009-12-08 13:45:43

AP無線路由器

2009-11-24 10:47:05

千兆以太網(wǎng)

2022-10-14 16:18:40

MobileNetAndroid端模型訓(xùn)練

2024-09-11 16:43:40

C#Word編程

2013-04-01 15:03:58

Android開發(fā)Android批量插入

2014-09-30 09:05:15

微軟WinHEC

2010-01-13 10:49:04

軟交換機(jī)技術(shù)

2010-01-05 17:43:29

JSON字符串

2010-11-16 13:54:47

Oracle標(biāo)識(shí)列

2023-11-01 11:34:21

ContextAndroid

2010-08-12 13:11:54

Universal AAndroid開發(fā)
點(diǎn)贊
收藏

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

国产视频一区二区三区在线播放 | 麻豆md0077饥渴少妇| 国产精品无码一区| 1024精品久久久久久久久| 欧美成人精精品一区二区频| av网站在线观看不卡| 1769视频在线播放免费观看| 韩国av一区二区三区四区 | 手机av在线免费| 理论片中文字幕| 日韩电影在线免费看| 伊人一区二区三区久久精品| a级大片免费看| 欧美电影网站| 一区二区三区产品免费精品久久75| 国产精品久久久久不卡| 青青草偷拍视频| 一呦二呦三呦国产精品| 日韩精品一区二| 男人添女人下面免费视频| 爱看av在线入口| 国产精品乱子久久久久| 久久久久久精| 国产黄a三级三级看三级| 久久精选视频| 久久久天堂国产精品女人| 国精产品一区一区三区免费视频| 欧美男人天堂| 亚洲免费电影在线| 亚洲成人网上| 欧美另类自拍| 波多野结衣中文字幕一区| 91日韩在线视频| 免费一级a毛片| 久久久成人网| 欧美性做爰毛片| 国产在线视频第一页| 97久久夜色精品国产| 亚洲性av网站| 欧美高清性xxxx| 成人av资源网址| 欧美一区二区成人6969| 亚洲精品www.| 老司机精品视频网| 欧美专区亚洲专区| 色诱视频在线观看| av电影一区| 色婷婷精品久久二区二区蜜臀av| 亚洲欧洲免费无码| 成人午夜电影在线观看| 久久久不卡影院| 国产69精品久久久久9999apgf| 九九热精品免费视频| 国产精品精品| 久久精品影视伊人网| 欧美xxxx精品| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 久久人人九九| 外国精品视频在线观看| 99re在线视频这里只有精品| 精品免费视频123区| 亚洲乱码在线观看| 成人午夜激情在线| 国偷自产av一区二区三区小尤奈| 中文天堂在线资源| 麻豆91在线看| 成人国产精品一区二区| 国产精品久久777777换脸| 极品美女销魂一区二区三区免费| 欧美野外猛男的大粗鳮| 国产又大又黄又粗| 日韩成人一级片| 91精品国产综合久久香蕉最新版| 91精品国产乱码久久久张津瑜| 色喇叭免费久久综合| 日韩在线观看免费av| 日韩视频中文字幕在线观看| 狠狠色狠狠色综合日日tαg| 欧美亚洲第一区| 免费黄色片视频| 国产一区二区精品久久99| 亚洲伊人久久综合| 天堂在线观看av| 国产目拍亚洲精品99久久精品| 国产精品国产精品国产专区蜜臀ah | 青草成人免费视频| 天天射天天干天天| 国产原创一区二区三区| 精品免费视频123区| 成年人视频在线看| 亚洲蜜桃精久久久久久久| 国产3p露脸普通话对白| 性欧美freehd18| 欧美一区二区播放| 亚洲乱码国产乱码精品精大量| 999久久精品| 亚洲精品一二区| 神马久久精品综合| 国产精品夜夜夜| 成人免费视频97| 少妇高潮久久久| 中文字幕日韩一区| 成熟丰满熟妇高潮xxxxx视频| 中文字幕中文字幕在线十八区| 中文字幕精品一区二区精品绿巨人| 精品国产免费久久久久久尖叫 | 国产91丝袜在线播放九色| 久草精品电影| 在线视频国产区| 色琪琪一区二区三区亚洲区| 国产精品99精品无码视亚| 欧美久久综合网| 久久久噜噜噜久久中文字免| 中文字幕在线2019| 91麻豆文化传媒在线观看| 中文字幕在线亚洲精品 | 国产精品五月天| 成年人网站国产| 欧美一区二区三区婷婷| 国产偷亚洲偷欧美偷精品| 欧美 日韩 国产 一区二区三区| 亚洲91久久| 国产精品福利网站| 五十路在线观看| 一区二区三区在线看| 国产免费又粗又猛又爽| 亚洲素人在线| 96精品视频在线| 亚洲黄色精品视频| 综合激情成人伊人| 亚洲欧美日韩一级| 精品久久久久久久| 欧美一级视频一区二区| 性中国xxx极品hd| 亚洲丝袜精品丝袜在线| 色片在线免费观看| 成人影视亚洲图片在线| 日本在线精品视频| 黄色在线播放| 色婷婷亚洲精品| 四虎影成人精品a片| 一区二区三区国产盗摄| 国内视频一区二区| av免费不卡| 亚洲福利在线观看| 日韩成人av毛片| 成人三级伦理片| 欧美在线一区视频| 偷拍一区二区| 热99精品里视频精品| 深夜福利在线观看直播| 欧美日韩免费区域视频在线观看| 最新中文字幕2018| 99久久99久久精品国产片桃花| 久久91亚洲精品中文字幕奶水 | 亚洲丝袜一区| 欧美成人乱码一区二区三区| 强乱中文字幕av一区乱码| 国产成人在线看| 亚洲理论电影在线观看| 成人在线tv视频| 91精品国产高清| 你懂得网站在线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 涩涩在线视频| 亚洲日韩中文字幕在线播放| 中国一区二区视频| 亚洲人成在线观看一区二区| 999久久久精品视频| 亚洲精品久久| 国产精品一区二区免费| 亚洲一二三四| xxx欧美精品| 亚洲风情第一页| 黑丝美女久久久| 最新中文字幕av| 狠狠色丁香久久婷婷综| 91视频 - 88av| 校花撩起jk露出白色内裤国产精品 | 亚洲专区中文字幕| av影院在线| 亚洲图片制服诱惑| 国产99999| 日韩欧美精品免费在线| 日韩av片在线免费观看| 成人综合婷婷国产精品久久| av动漫免费看| 欧美黄在线观看| 欧美日韩亚洲免费| 精品伊人久久| 国产suv精品一区二区| 香蕉视频在线看| 精品国产91乱码一区二区三区| 成人信息集中地| 成人一区二区在线观看| 三级a在线观看| 欧美精品aa| 亚洲成人在线视频网站| 丁香五月缴情综合网| 国产精品欧美激情| 爱搞国产精品| 久久天天躁夜夜躁狠狠躁2022| 国产又粗又猛视频| 欧美日韩免费网站| 激情五月婷婷小说| 国产精品久久久久永久免费观看| 亚洲欧美另类动漫| 欧美片第1页综合| 神马影院我不卡午夜| 豆花视频一区二区| 成人av资源在线播放| 亚洲成人短视频| 国产最新精品视频| 嫩草香蕉在线91一二三区| 亚洲欧美福利视频| 丰满熟妇人妻中文字幕| 欧美酷刑日本凌虐凌虐| 激情视频网站在线观看| 亚洲成人av在线电影| 午夜剧场免费在线观看| 欧美激情综合五月色丁香| 欧产日产国产精品98| 国产一区二区在线看| 亚洲 欧美 另类人妖| 亚洲影视在线| 日本国产在线播放| 亚洲电影在线| 国产黄色激情视频| 91精品动漫在线观看| 亚洲欧洲一二三| 九九综合久久| 久久综合久久久| 美日韩黄色大片| 国产精品成人观看视频免费| 成人免费91| 91久久精品久久国产性色也91| 欧美xxxx黑人又粗又长| 久久久极品av| 超碰公开在线| 久久影视电视剧免费网站清宫辞电视| 国产剧情精品在线| 精品久久香蕉国产线看观看gif| 级毛片内射视频| 久久精品在线免费观看| 97人妻精品一区二区免费| 久久蜜臀精品av| 亚洲性猛交xxxx乱大交| 久久美女艺术照精彩视频福利播放 | 国产在线精彩视频| 97免费视频在线| 台湾佬中文娱乐网欧美电影| 91福利视频在线观看| 国产精品迅雷| 国产精品www| 欧美成人一二区| 亚洲一区二区三区乱码aⅴ| 中文成人在线| av免费精品一区二区三区| 综合激情网...| 久久久99爱| 精品国产精品久久一区免费式| www.久久爱.cn| 激情小说一区| 噜噜噜噜噜久久久久久91| 免费黄色成人| 亚洲精品乱码视频| 性xxxx欧美老肥妇牲乱| 国产性生活免费视频| 99这里有精品| 熟妇人妻va精品中文字幕| 久久精品国产一区二区三区免费看 | 久草中文在线观看| 九九热99久久久国产盗摄| 第一福利在线视频| 国产精品扒开腿爽爽爽视频 | 精品成人一区二区三区免费视频| 欧美成人猛片aaaaaaa| 日韩欧美在线番号| 国产一区二区三区四区福利| 最爽无遮挡行房视频在线| 欧美一级淫片aaaaaaa视频| 草莓视频成人appios| 亚洲自拍小视频免费观看| 里番精品3d一二三区| 亚洲高清视频一区二区| 国精品一区二区三区| 国产成人久久777777| 国产一级精品在线| 精品国产av无码| 亚洲狼人国产精品| 日日夜夜操视频| 91精品在线麻豆| 青青草在线播放| 美女av一区二区| 成人欧美magnet| av观看久久| 日韩一区二区三区免费播放| 九色自拍视频在线观看| 久久国产精品第一页| 中文字幕av观看| 亚洲免费三区一区二区| 波多野结衣家庭主妇| 日韩三级电影网址| 成人网视频在线观看| 91精品国产色综合| 亚洲精品高潮| 中文字幕99| 日日夜夜免费精品视频| 精产国品一区二区三区| 国产精品天干天干在观线| 国产情侣自拍av| 日韩精品一区二区三区视频在线观看 | 色婷婷粉嫩av| 欧美性猛交xxxxx水多| 国内精品久久久久影院薰衣草| 91香蕉电影院| 日韩在线麻豆| 国产成人一区二区三区别| 蜜桃一区二区三区在线| 国产一级二级在线观看| 一区二区三区四区国产精品| 中文字幕理论片| 亚洲人成77777在线观看网| 2018av在线| 国产91免费视频| 影视亚洲一区二区三区| a在线观看免费视频| 久久久91精品国产一区二区精品| www.av免费| 欧美日韩在线播放三区四区| 男女视频在线观看免费| 2019中文字幕在线| 91午夜精品| 中文精品无码中文字幕无码专区| 亚洲一区黄色| 屁屁影院国产第一页| 亚洲成av人片在线观看| 亚洲国产精品久久久久久6q | 欧美男男同志| 91禁国产网站| 欧美日韩一区二区三区四区不卡| 日本不卡在线播放| 男人的天堂成人在线| 亚洲av综合一区二区| 欧美性xxxx极品hd欧美风情| 少妇高潮一区二区三区69| 97久久超碰福利国产精品…| 国产精品99久久免费观看| www.国产在线视频| 成人av电影在线| 久久国产视频播放| 亚洲欧美一区二区三区四区| 欧美日韩美女| 手机成人在线| 极品美女销魂一区二区三区| 91麻豆精品成人一区二区| 91精品麻豆日日躁夜夜躁| 中日韩高清电影网| 国产精品亚洲一区| 亚洲综合不卡| 男人的天堂官网| 欧美一区二区三区婷婷月色| 三级资源在线| 美女亚洲精品| 麻豆久久久久久久| 欧美精品久久久久性色| 亚洲国产黄色片| 日本在线视频一区二区| 在线观看视频黄色| 成人精品视频一区二区三区| 狠狠人妻久久久久久| 日韩在线视频线视频免费网站| 亚洲精品成人图区| 午夜精品一区二区三区四区 | 日韩va在线观看| 伊人开心综合网| 青青草免费在线| 成人激情视频在线| 136国产福利精品导航网址| 亚洲av无码一区二区二三区| 欧美日韩不卡一区| 爱情岛论坛亚洲品质自拍视频网站| 91免费的视频在线播放| 亚洲高清激情| 天堂网av2018| 亚洲国产另类 国产精品国产免费| 色www永久免费视频首页在线| 国产视频福利一区| 日韩天堂av| 日本免费网站视频| 亚洲国产精品99久久| 国产精品久久久久久吹潮| 国产精品久久国产| 久久久精品综合| 亚洲精品一区二区三区区别| 国产精品美女免费视频| 尤物精品在线| caoporn91| 最近2019中文字幕在线高清| 精品三级av在线导航|