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

如何讓Java編譯器幫你寫代碼

開發
本文主要是結合監控埋點這個場景分享一種解決樣板化代碼的思路,希望能起到拋磚引玉的作用。下面將從組件介紹、技術選型過程、實現原理及部分源碼實現逐步展開講解。

背景

監控是服務端應用需要具備的一個非常重要的能力,通過監控可以直觀的看到核心業務指標、服務運行質量等,而要做到可監控就需要進行相應的監控埋點。大家在埋點過程中經常會編寫大量重復代碼,雖能實現基本功能,但耗時耗力,不夠優雅。根據“DRY(Don't Repeater Yourself)"原則,這是代碼中的“壞味道”,對有代碼潔癖的人來講,這種重復是不可接受的。那有什么方法解決這種“重復”嗎?經過綜合調研,基于前端編譯器插樁技術,實現了一個埋點組件,通過織入埋點邏輯,讓Java 編譯器幫我們寫代碼。經過不斷打磨,已經被包括京東APP主站服務端在內的很多團隊廣泛使用。

本文主要是結合監控埋點這個場景分享一種解決樣板化代碼的思路,希望能起到拋磚引玉的作用。下面將從組件介紹、技術選型過程、實現原理及部分源碼實現逐步展開講解。

組件介紹

京東內部監控系統叫UMP,與所有的監控系統一樣,核心部分有埋點、上報、分析整合、報警、看板等等,本文講的組件主要是為對監控埋點原生能力的增強,提供一種更優雅簡潔的實現。

我們先來看下傳統硬編碼的埋點方式,主要分為創建埋點對象、可用率記錄、提交埋點 3 個步驟:

圖片

通過上圖可以看到,真正的邏輯只有紅框中的范圍,為了完成埋點要把這段代碼都圍繞起來,代碼層級變深,可讀性差,所有埋點都是這樣的樣板代碼。

下面來看下使用組件后的埋點方式:

圖片

通過對比很容易看到,使用組件后的方式只要在方法上加一個注解就可以了,代碼可讀性有明顯的提升。組件由埋點封裝API和AST操作處理器 2 部分組成。

  • 埋點API封裝:在運行時被調用,對原生埋點做了封裝和抽象,方便使用者進行監控KEY的擴展。
  • AST操作處理器:在編譯期調用,它將根據注解@UMP把埋點封裝API按照規則織入方法體內。

(注:結合京東實際業務場景,組件實現了fallback、自定義可用率、重名方法區分、配套的IDE插件、監控key自定義生成規則等細節功能,由于本文主要是講解底層實現原理,詳細功能不在此贅述,感興趣的京東同事可以內網聯系咨詢:liushijie3)

技術選型過程

通過上面的示例代碼,相信很多人覺得這個功能很簡單,用 Spring AOP 很快就能搞定了。的確很多團隊也是這么做的,不過這個方案并不是那么完美,下面的選型分析中會有相關的解釋,請耐心往下看。如下圖,從軟件的開發周期來看,可織入埋點的時機主要有 3 個階段:編譯期、編譯后和運行期。

圖片

01編譯期

這里的編譯期指將Java源文件編譯為class字節碼的過程。Java編譯器提供了基于 JSR 269 規范[1]的注解處理器機制,通過操作AST (抽象語法樹,Abstract Syntax Tree,下同)實現邏輯的織入。業內有不少基于此機制的應用,比如Lombok 、MapStruct 、JPA 等;此機制的優點是因為在編譯期執行,可以將問題前置,沒有多余依賴,因此做出來的工具使用起來比較方便。缺點也很明顯,要熟練操作 AST并不是想的那么簡單,不理解前后關聯的流程寫出來的代碼不夠穩定,因此要花大量時間熟悉編譯器底層原理。當然這個過程對使用者來講是沒有感知的。

02編譯后

編譯后是指編譯成 class 字節碼之后,通過字節碼進行增強的過程。此階段插樁需要適配不同的構建工具:Maven、Gradle、Ant、Ivy等,也需要使用方增加額外的構建配置,因此存在開發量大和使用不夠方便的問題,首先要排除掉此選項??赡苤挥袠O少數場景下才會需要在此階段插樁。

03運行期

運行期是指在程序啟動后,在運行時進行增強的過程,這個階段有 3 種方式可以織入邏輯,按照啟動順序,可以分為:靜態 Agent、AOP 和動態 Agent。

1、 靜態 Agent

JVM 啟動時使用 -javaagent 載入指定 jar 包,調用 MANIFEST.MF 文件里的 Premain-Class 類的 premain 方法觸發織入邏輯。是技術中間件最常使用的方式,借助字節碼工具完成相關工作。應用此機制的中間件有很多,比如:京東內部的鏈路監控 pfinder、外部開源的 skywalking 的探針、阿里的 TTL 等等。這種方式優點是整體比較成熟,缺點主要是兼容性問題,要測試不同的 JDK 版本代價較大,出現問題只能在線上發現。同時如果不是專業的中間件團隊,還是存在一定的技術門檻,維護成本比較高;

2、 Spring AOP

Spring AOP大家都不陌生,通過 Spring 代理機制,可以在方法調用前后織入邏輯。AOP 最大的優點是使用簡單,同樣存在不少缺點:

  1. 同一類內方法A調用方法B時,是無法走到切面的,這是Spring 官方文檔的解釋[2] “However, once the call has finally reached the target object (the SimplePojo reference in this case), any method calls that it may make on itself, such as this.bar() or this.foo(), are going to be invoked against the this reference, and not the proxy”。這個問題會導致內部方法調用的邏輯執行不到。在監控埋點這個場景下就會出現丟數據的情況;
  2. AOP只能環繞方法,方法體內部的邏輯沒有辦法干預??坎蹲疆惓E袛噙壿嬍遣粔虻?,有些場景需要是通過返回值狀態來判斷邏輯是否正常,使用介紹里面的示例代碼就是此種情況,這在 RPC 調用解析里是很平常的操作。
  3. 私有方法、靜態方法、final class和方法等場景無法走切面

3、 動態 Agent

動態加載jar包,調用MANIFEST.MF文件中聲明的Agent-Class類的agentmain方法觸發織入邏輯。這種方式主要用來線上動態調試,使用此機制的中間件也有很多,比如:Btrace、Arthas等,此方式不適合常駐內存使用,因此要排除掉。

04最終方案

選擇通過上面的分析梳理可知,要實現重復代碼的抽象有 3 種方式:基于JSR 269 的插樁、基于 Java Agent 的字節碼增強、基于Spring AOP的自定義切面。接下來進一步的對比:

圖片

如上表所示,從實現成本上來看,AOP 最簡單,但這個方案不能覆蓋所有場景,存在一定的局限性,不符合我們追求極致的調性,因此首先排除。Java Agent 能達到的效果與 JSR 269 相同,但是啟動參數里需要增加 -javaagent 配置,有少量的運維工作,同時還有 JDK 兼容性的坑需要趟,對非中間件團隊來說,這種方式從長久看會帶來負擔,因此也要排除。

基于 JSR 269 的插樁方式,對Java編譯器工作流程的理解和 AST 的操作會帶來實現上的復雜性,前期投入比較大,但是組件一旦成型,會帶來一勞永逸的解決方案,可以很自信的講,插樁實現的組件是監控埋點場景里的銀彈(事實證明了這點,不然也不敢這么吹)。

冰山之上,此組件給使用者帶來了簡潔優雅的體驗,一個jar包,一行代碼,妙筆生花。那冰山之下是如何實現的呢?那就要從原理說起了。

插樁實現原理

簡單來講,插樁是在編譯期基于 JSR 269的注解處理器中操作AST的方式操縱語法節點,最終編譯到class文件中。要做好插樁理解相關的底層原理是必要的。大多數讀者對編譯器相關內容比較陌生,這里會用較大的篇幅做個相對系統的介紹。

Java編譯器是將源碼翻譯成 class 字節碼的工具,Java編譯器有多種實現:Open JDK的javac、Eclipse的ecj和ajc、IBM的jikes等,javac是公司內主要的編譯器,本文是基于Open JDK 1.8 講解。

作為一款工業級編譯器內部實現比較復雜,其涵蓋的內容足夠寫一本書了。結合本人對javac源碼的理解,嘗試通俗易懂的講清楚插樁涉及到的知識,有不盡之處歡迎指正。有興趣進一步研究的讀者建議閱讀 javac源碼[6]。下面將講解編譯器執行流程,相關javac源碼導航,以及注解處理器如何運作。

01編譯器執行流程

根據官網資料[3]javac 處理流程可以粗略的分為 3個部分:Parse and Enter、Annotation Processing、Analyse and Generate,如下圖:

圖片

Parse and EnterParse

階段主要通過詞法分析器(Scanner)讀取源碼生產 token 流,被語法分析器(JavacParser)消費構造出AST,Java代碼都可以通過AST表達出來,讀者可以通過JCTree查看相關的實現。為了讓讀者能更直觀的理解AST,本人做了一個源碼解析成AST后的圖形化展示:

示例源碼:

圖片

token流:[ package ] <- [ com ] <- [ . ] <- …... <- [ } ]解析成AST后如下:

圖片

Enter階段主要是根據AST填充符號表,此處為插樁之后的流程,因此不再展開。

Annotation Processing

注解處理階段,此處會調用基于 JSR269 規范的注解處理器,是javac對外的擴展。通過注解處理器讓開發者(指非javac開發者,下同)具備自定義執行邏輯的能力,這就是插樁的關鍵。在這個階段,可以獲取到前一階段生成的AST,從而進行操作。

Analyse and Generate

分析AST并生成class字節碼,此處為插樁之后的流程,不再展開。

02相關javac源碼導航

javac觸發入口類路徑是:com.sun.tools.javac.Main,代碼如下:

圖片

經驗證Maven 執行構建調的是此類中的main方法。其他構建工具未做驗證,猜測類似的。在JDK內部也提供了javax.tools.ToolProvider#getSystemJavaCompiler的入口,實際上內部實現也是調的這個類里的compile方法。

經過一系列的命令參數解析和初始化操作,最終調到真正的核心入口,方法是com.sun.tools.javac.main.JavaCompiler#compile,如下圖:

圖片

這里有3個關鍵調用:

  • 852行:初始化注解處理器,通過Main入口的調用是通過JDK SPI的方式收集。
  • 855 – 858行:對應前面流程圖里的Parse and Enter和Annotation Processing兩個階段的流程,其中方法processAnnotations便是執行注解處理器的觸發入口。
  • 860行:對應Analyse and Generate階段的流程。

03注解處理器

Java從JDK 1.6 開始,引入了基于JSR 269 規范的注解處理器,允許開發者在編譯期間執行自己的代碼邏輯。如本文講的UMP監控埋點插樁組件一樣,由此衍生出了很多優秀的技術組件,如前面提到的Lombok、Mapstruct等。注解處理器使用比較簡單,后面示例代碼有注解處理器簡單實現也可以參考。這里重點講一下注解處理器整體執行原理:

  1. 編譯開始的時候,會執行方法initProcessAnnotations (compile的截圖852行),以SPI的方式收集到所有的注解處理器,SPI對應接口:javax.annotation.processing.Processor。
  2. 在方法processAnnotations中執行注解處理器調用方法JavacProcessingEnvironment#doProcessing。
  3. 所有的注解處理器處理完畢一次,稱為一輪(round),每輪開始會執行一次Processor#init方法以便開發者自定義初始化信息,如緩存上下文等。初始化完成后,javac會根據注解、版本等條件過濾出符合條件的注解處理器,并調用其接口方法Processor#process,即開發者自定義的實現。
  4. 在開發者自定義的注解處理器里,實現AST操作的邏輯。
  5. 一輪執行完成后,發現新的Java源文件或者class文件,則開啟新的一輪。直到不再產生Java或者class文件為止。有的開源項目實現注解處理器時,為了保證自身可以繼續執行,會通過這個機制創建一個空白的Java文件達到目的,其實這也是理解原理的好處。
  6. 如果在一輪中未發現新的Java源文件和class文件產生則執行最后一輪(lastRound)。最后一輪執行完畢后,如果有新的Java源文件生成,則進行Parse and Enter 流程處理。到這里,整個注解處理器的流程就結束了。
  7. 進入Analyse and Generate階段,最終生成class,完成整體編譯。

接下來將通過UMP監控埋點功能來展示怎么在注解處理器中操作AST。

源碼示例

關于AST 操作的探索,早在2008年就有相關資料了[4],Lombok、Mapstruct都是開源的工具,也可以用來參考學習。這里簡單講一個示例,展示如何插樁。

注解處理器使用框架

圖片

上圖展示了注解處理器具體的基本使用框架,init、process是注解處理器的核心方法,前者是初始化注解處理器的入口,后者是操作AST的入口。javac還提供了一些有用的工具類,比如:

  • TreeMaker:創建AST的工廠類,所有的節點都是繼承自JCTree,并通過TreeMaker完成創建。
  • JavacElements:操作Element的工具類,可以用來定位具體AST。

向類中織入一個import節點

這里舉一個簡單場景,向類中織入一個import節點:

圖片

為方便理解對代碼實現做了簡化,可以配合注釋查看如何織入:

圖片

圖片

總的來說,織入邏輯是通過TreeMaker創建AST 節點,并操作現有AST織入創建的節點,從而達到了織入代碼的目的。

反思與總結

到這里,講了埋點組件的使用、技術選型、以及插樁相關的內容,最終開發出來的組件在工作中也起到了很好的效果。但是在這個過程中有一些反思。

插樁門檻高

通過前面的內容不難得出一個事實,要實現一個小小的功能,需要開發者花費大量的精力去學習理解編譯器底層的一些原理。從ROI角度看,投入和產出是嚴重不成正比的。為了能提供可靠的實現,個人花費了大量業余時間去做技術選型分析和編譯器相關知識,可以說是純靠個人的興趣和一股倔勁一點點搭建起來的,細節是魔鬼,這個踩坑的過程比較枯燥。實際上插樁機制有很多通用的場景可以探索,之所以一直很少見到此類機制的應用。主要是其門檻較高,對大多數開發者來說比較陌生。因此降低開發者使用門檻才能讓一些想法變成現實。做一把好用的錘子,比砸入一個釘子要更有價值。在監控埋點插樁組件真正落地時,在項目內做了一定抽象,并支持了一些開關、自定義鏈路跟蹤等功能。但從作用范圍來講是不夠的,所以下一步計劃做一個插樁方面的技術框架,從易用性、可維護性等方面做好進一步的抽象,同時做好可測試性相關工作,包含驗證各版本JDK的支持、各種Java語法的覆蓋等。

插樁是把雙刃劍

javac官方對修改AST的方式持保守態度,也存在一些爭議。然而時間是最好的驗證工具,從Lombok 等組件的發展看出,插樁機制是能經住長久考驗的。如何合理利用這種能力是非常重要的,合理使用可使系統簡潔優雅,使用不當就等于在代碼里下毒了。所以要有節制的修改AST,要懂前后運行機制,圍繞通用的場景使用,避免濫用。

認識當前上下文環境的局限性

遇到問題時,如果在當前的上下文環境里找不到合適的解決方案,從這個環境跳出來換個維度也許能看到不同的風景。就像物理機到虛擬機再到現在的容器,都是打破了原來的規則逐步發展出新的技術生態。大多數的開發工作都是基于一個高層次的封裝上面進行,而突破往往都是從底層開始的,適當的時候也可以向下做一些探索,可能會產生一些有價值的東西。

責任編輯:未麗燕 來源: 京東零售技術
相關推薦

2012-04-05 09:13:17

C代碼

2022-12-12 12:04:59

ChatGPT代碼軟件

2017-03-20 18:01:55

編譯器匯編

2023-11-15 17:58:58

C++代碼

2025-11-21 08:29:10

suspend編譯器JVM

2020-12-04 07:49:54

AICtrl C代碼

2011-05-18 11:06:25

java編譯器

2010-09-16 15:57:25

Java編譯器

2010-01-14 15:29:44

C++編譯器

2020-04-02 15:39:51

代碼編譯器前端

2014-05-04 12:51:21

Javascript編譯器

2010-01-27 16:39:48

C++編譯器

2010-09-16 16:05:24

Java編譯器

2021-06-08 07:48:26

lambda表達式編譯器

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-03-23 11:17:16

Python 動態編譯

2009-08-10 17:12:54

C#編譯器

2013-03-29 10:02:37

編譯器語言編譯開發

2010-03-26 16:23:07

Visual Stud
點贊
收藏

51CTO技術棧公眾號

综合国产精品| 日韩av超清在线观看| 成人av资源网站| 欧美专区福利在线| 日本视频在线免费| 日本精品视频| 日韩欧美成人区| 亚洲欧美丝袜| 精品欧美一区二区精品少妇| 一道本一区二区| www.xxxx精品| 香港三日本8a三级少妇三级99| 欧亚一区二区| 一区二区三区在线高清| 欧美日韩在线一二三| av中文字幕免费| 六月天综合网| 欧美高清激情视频| 毛片aaaaaa| 色狠狠久久av综合| 欧美一级爆毛片| 日本新janpanese乱熟| 丝袜国产在线| 国产女人18水真多18精品一级做| 成人h视频在线观看| 免费视频久久久| 国内久久视频| 色噜噜亚洲精品中文字幕| 51调教丨国产调教视频| 日韩视频1区| 6080午夜不卡| 看欧美ab黄色大片视频免费| 大黄网站在线观看| 亚洲视频一区二区在线观看| 日韩国产精品一区二区| 视频三区在线观看| 成人午夜大片免费观看| 91精品视频在线播放| 国产成人麻豆免费观看| 国产精品亚洲综合久久| 高清欧美性猛交xxxx黑人猛交| 国产精品国产三级国产传播| 国产成人一区| 亚洲欧美激情视频| 麻豆国产精品一区| 日本一区福利在线| 亚洲激情第一页| 日本69式三人交| 盗摄牛牛av影视一区二区| 日韩欧美高清一区| 老女人性生活视频| 亚州一区二区| 欧美videos中文字幕| 成人在线短视频| 国产亚洲精aa在线看| 欧美丰满一区二区免费视频| 三级av免费观看| 成人a在线观看高清电影| 在线观看不卡视频| 国产主播中文字幕| 国产精品4hu.www| 欧美色综合网站| 日本不卡一区二区在线观看| 亚瑟国产精品| 日韩欧美在线一区二区三区| wwwww在线观看| 成人自拍在线| 亚洲精品国产拍免费91在线| 日韩精品卡通动漫网站| 亚洲男人都懂第一日本| 国产亚洲精品高潮| 天堂av网手机版| 91精品国产自产在线观看永久∴| 久久在线精品视频| 欧美片一区二区| 亚洲第一伊人| 国产97人人超碰caoprom| 伊人久久久久久久久久久久| 老汉av免费一区二区三区| 成人免费看黄网站| 乱色精品无码一区二区国产盗| av色综合久久天堂av综合| 欧美日本韩国一区二区三区| av在线三区| 一区二区三区色| 日韩avxxx| 亚洲久草在线| 精品国产一区二区在线观看| 黄色a一级视频| 精品国产91乱码一区二区三区四区| 中文字幕久久久| 色在线观看视频| 亚洲欧美日韩专区| 成人做爽爽免费视频| 天堂成人在线视频| 国产精品视频你懂的| 黄网站色视频免费观看| 在线观看网站免费入口在线观看国内| 欧美私人免费视频| 在线观看一区二区三区四区| 国产日产精品一区二区三区四区的观看方式 | 香蕉视频禁止18| 视频二区欧美| 亚洲视频欧洲视频| 精品无码人妻一区二区三区品| 午夜影院日韩| 波多野结衣成人在线| 阿v免费在线观看| 午夜亚洲福利老司机| 亚洲欧美视频二区| 日韩美脚连裤袜丝袜在线| 精品久久久av| 无码人妻精品一区二| 国产福利一区二区三区在线视频| 日本成人三级电影网站| 国产蜜臀在线| 91精品国产综合久久久蜜臀粉嫩| 三级电影在线看| 精品69视频一区二区三区Q| 国产精品尤物福利片在线观看| 神马午夜电影一区二区三区在线观看| 国产精品久线在线观看| 久久久久久久久久久免费视频| 欧美h版在线观看| 日韩中文字幕视频在线观看| 久视频在线观看| 久久国产精品一区二区| 日本高清不卡一区二区三| av资源网在线播放| 日韩欧美国产电影| 暗呦丨小u女国产精品| 蜜臀a∨国产成人精品| 欧美精品123| 国产高清自产拍av在线| 欧美大片在线观看一区| www.av免费| 久久99国产精品久久99| 色噜噜一区二区| 日韩国产网站| 国产一区二区三区久久精品| 天天综合天天干| 91在线云播放| 日韩av综合在线观看| 久久影视三级福利片| 久久久久久久国产精品| 性网爆门事件集合av| 亚洲免费伊人电影| 麻豆网站免费观看| 欧美在线精品一区| 91精品国产一区二区三区动漫 | 欧美亚洲另类制服自拍| 日本xxxxxwwwww| 亚洲观看高清完整版在线观看| 免费在线观看日韩av| 影院欧美亚洲| 久久国产精品亚洲va麻豆| 三妻四妾的电影电视剧在线观看| 亚洲黄页网在线观看| 国产性猛交╳xxx乱大交| 26uuu精品一区二区| 免费高清在线观看免费| 国产精品免费大片| 日本一欧美一欧美一亚洲视频| 男人天堂资源在线| 欧美在线观看视频一区二区 | 黄色av成人| 国产乱码精品一区二区三区不卡| 成av人片在线观看www| 日韩精品999| 日韩不卡高清视频| 最新日韩av在线| 丰满少妇一区二区三区专区| 亚洲美女黄网| 日本精品一区二区| crdy在线观看欧美| 国内精品久久久久久中文字幕| 午夜视频免费看| 91国内精品野花午夜精品| 91视频最新网址| 东方aⅴ免费观看久久av| 日韩少妇内射免费播放| 日韩影院二区| 国产精品12| 日本综合久久| 久久99精品视频一区97| 欧美女v视频| 欧美日韩国产一区二区三区地区| 欧美片一区二区| 国产区在线观看成人精品 | 俺去亚洲欧洲欧美日韩| 亚洲成人中文字幕在线| 色婷婷久久综合| www.av成人| 26uuu亚洲| 超碰91在线播放| 亚洲影院一区| 久久视频免费在线| 奇米色欧美一区二区三区| 91丨九色丨国产在线| 一区二区乱码| 久久99精品久久久久久琪琪| 国产高清一级毛片在线不卡| 日韩视频免费直播| 免费视频网站在线观看入口| 亚洲综合一区二区三区| 在线观看亚洲大片短视频| 成人丝袜高跟foot| 高潮一区二区三区| 国产精品久久久免费| 强开小嫩苞一区二区三区网站 | 2022中文字幕| 精品国产美女| 国产精品我不卡| www.成人在线.com| 国产精品高清在线| 2019中文字幕在线电影免费| 精品国产一区二区三区久久狼黑人 | 亚洲国产小视频在线观看| 888奇米影视| 日本韩国一区二区| 国产成人在线播放视频| 亚洲精品写真福利| www中文在线| 国产日韩欧美不卡| 美国黄色a级片| 成人看片黄a免费看在线| 欧美激情第一区| 美女看a上一区| 午夜欧美福利视频| 久久深夜福利| 日韩视频第二页| 亚洲精品护士| 久久国产精品网| 欧美日韩综合| 蜜臀在线免费观看| 中文在线日韩| 国产又大又长又粗又黄| 91免费精品| 亚洲狠狠婷婷综合久久久| 国产99久久久国产精品成人免费 | 丰满熟妇乱又伦| 日韩一级免费观看| 精品国产九九九| 91精品国产免费| 国产乱人乱偷精品视频| 欧美丰满嫩嫩电影| 国产精品久久久久久久久毛片 | 国产精品第七页| 成人av网址在线| 精品熟女一区二区三区| www.亚洲免费av| 少妇激情一区二区三区视频| 94色蜜桃网一区二区三区| 中文字幕一区二区久久人妻网站 | 久久综合九色综合久99| 日韩理论电影中文字幕| 农村寡妇一区二区三区| 婷婷成人综合| 日韩精品一区二区三区外面| 欧美在线电影| 中文字幕欧美人与畜| 一级毛片免费高清中文字幕久久网| 久久久久亚洲av无码专区喷水| 中文字幕一区二区av| 人妻激情另类乱人伦人妻| 亚洲黄色三级| 久久9精品区-无套内射无码| 日日摸夜夜添夜夜添国产精品| 我要看一级黄色大片| 久久爱www久久做| 免费欧美一级片| 不卡一卡二卡三乱码免费网站| 三级男人添奶爽爽爽视频| 久久这里只精品最新地址| 国产18无套直看片| 亚洲免费资源在线播放| 日韩欧美视频在线免费观看| 色婷婷久久久亚洲一区二区三区| 夜夜嗨av禁果av粉嫩avhd| 日韩一区二区在线免费观看| 免费av一级片| 国产亚洲精品久久久久久牛牛| 看黄网站在线| 91精品国产色综合久久不卡98| 午夜日韩成人影院| 亚洲最大成人在线| 校花撩起jk露出白色内裤国产精品| 日本一区二区三区免费观看| 91精品一区二区三区综合在线爱| 久久99中文字幕| 免费观看在线色综合| 久久久男人的天堂| 亚洲国产精品精华液2区45| 欧美日韩中文字幕在线观看| 粉嫩av一区二区三区免费野| 一区二区日韩视频| 日韩av综合网站| 里番在线观看网站| 热99在线视频| 涩爱av色老久久精品偷偷鲁| 欧美亚洲一级二级| 欧美天天视频| 中文字幕第100页| 91女人视频在线观看| caoporn91| 91国在线观看| 日本黄色一区二区三区| 日韩在线欧美在线| 在线日韩影院| yy111111少妇影院日韩夜片| 久久蜜桃av| 麻豆传传媒久久久爱| 成人动漫av在线| 国产午夜手机精彩视频| 欧美中文一区二区三区| 婷婷五月综合久久中文字幕| 久久亚洲精品一区二区| 日韩成人亚洲| 久久综合福利| 亚洲黄色毛片| 69亚洲乱人伦| 亚洲精品免费在线观看| 波多野结衣不卡| 日韩精品在线播放| heyzo高清在线| 91传媒免费看| 自产国语精品视频| 亚洲一级免费观看| 国产亚洲美州欧州综合国| 日韩欧美性视频| 精品国产乱子伦一区| 伊人手机在线| 91在线网站视频| 天天久久综合| 天天色综合社区| 国产日韩精品一区二区三区| 日韩人妻精品中文字幕| 亚洲欧美激情在线视频| 原纱央莉成人av片| 免费成人看片网址| 老鸭窝毛片一区二区三区| 老鸭窝一区二区| 欧美日韩视频免费播放| 人妻丰满熟妇av无码区hd| 欧美精品www| 粉嫩精品导航导航| 久艹视频在线免费观看| 成人的网站免费观看| 久久夜色精品亚洲| 亚洲精品美女视频| 亚洲美女炮图| 日本一区美女| 蜜臀av亚洲一区中文字幕| 羞羞在线观看视频| 欧美一区国产二区| 日本三级在线观看网站 | 欧美三级美国一级| 亚洲成人av免费看| 国产精品久久久久久久久图文区| 一本一道人人妻人人妻αv| 日韩视频在线免费观看| 懂色av色香蕉一区二区蜜桃| 男插女免费视频| 国产不卡在线视频| 国产精品视频免费播放| 亚洲日韩中文字幕| 欧美日韩va| 国产黄色激情视频| 97久久超碰国产精品电影| 一级黄色av片| 久久精品国产亚洲一区二区| 日韩在线观看一区二区三区| 国产午夜福利100集发布| xnxx国产精品| 91欧美日韩麻豆精品| 久久99国产综合精品女同| 青青视频一区二区| 三上悠亚在线一区二区| 亚洲免费高清视频在线| 少妇精品高潮欲妇又嫩中文字幕| 欧美在线一级视频| 久久影视一区| 欧美肉大捧一进一出免费视频| 色综合天天综合色综合av| 免费黄网站在线| 国产伦精品一区二区三区四区免费| 久久精品亚洲| 一区二区成人免费视频| 日韩精品在线免费观看| 亚洲精品无播放器在线播放| 精品少妇人妻av免费久久洗澡| 国产欧美中文在线| 亚洲乱码在线观看| 国产z一区二区三区| 欧美激情无毛| 国产aⅴ激情无码久久久无码| 欧美一区在线视频| 欧美亚洲韩国| 精品视频在线观看一区二区| 国产亚洲一区二区三区四区|