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

如何實現Java類隔離加載?

開發 后端
Java 開發中,如果不同的 jar 包依賴了某些通用 jar 包的版本不一樣,運行時就會因為加載的類跟預期不符合導致報錯。

[[361033]]

Java 開發中,如果不同的 jar 包依賴了某些通用 jar 包的版本不一樣,運行時就會因為加載的類跟預期不符合導致報錯。如何避免這種情況呢?本文通過分析 jar 包產生沖突的原因及類隔離的實現原理,分享兩種實現自定義類加載器的方法。

一 什么是類隔離技術

只要你 Java 代碼寫的足夠多,就一定會出現這種情況:系統新引入了一個中間件的 jar 包,編譯的時候一切正常,一運行就報錯:java.lang.NoSuchMethodError,然后就哼哧哼哧的開始找解決方法,最后在幾百個依賴包里面找的眼睛都快瞎了才找到沖突的 jar,把問題解決之后就開始吐槽中間件為啥搞那么多不同版本的 jar,寫代碼五分鐘,排包排了一整天。

上面這種情況就是 Java 開發過程中常見的情況,原因也很簡單,不同 jar 包依賴了某些通用 jar 包(如日志組件)的版本不一樣,編譯的時候沒問題,到了運行時就會因為加載的類跟預期不符合導致報錯。舉個例子:A 和 B 分別依賴了 C 的 v1 和 v2 版本,v2 版本的 Log 類比 v1 版本新增了 error 方法,現在工程里面同時引入了 A、B 兩個 jar 包,以及 C 的 v0.1、v0.2 版本,打包的時候 maven 只能選擇一個 C 的版本,假設選擇了 v1 版本。到了運行的時候,默認情況下一個項目的所有類都是用同一個類加載器加載的,所以不管你依賴了多少個版本的 C,最終只會有一個版本的 C 被加載到 JVM 中。當 B 要去訪問 Log.error,就會發現 Log 壓根就沒有 error 方法,然后就拋異常java.lang.NoSuchMethodError。這就是類沖突的一個典型案例。

類沖突的問題如果版本是向下兼容的其實很好解決,把低版本的排除掉就完事了。但要是遇到版本不向下兼容的那就陷入了“救媽媽還是救女朋友”的兩難處境了。

為了避免兩難選擇,有人就提出了類隔離技術來解決類沖突的問題。類隔離的原理也很簡單,就是讓每個模塊使用獨立的類加載器來加載,這樣不同模塊之間的依賴就不會互相影響。如下圖所示,不同的模塊用不同的類加載器加載。為什么這樣做就能解決類沖突呢?這里用到了 Java 的一個機制:不同類加載器加載的類在 JVM 看來是兩個不同的類,因為在 JVM 中一個類的唯一標識是 類加載器+類名。通過這種方式我們就能夠同時加載 C 的兩個不同版本的類,即使它類名是一樣的。注意,這里類加載器指的是類加載器的實例,并不是一定要定義兩個不同類加載器,例如圖中的 PluginClassLoaderA 和 PluginClassLoaderB 可以是同一個類加載器的不同實例。

二 如何實現類隔離

前面我們提到類隔離就是讓不同模塊的 jar 包用不同的類加載器加載,要做到這一點,就需要讓 JVM 能夠使用自定義的類加載器加載我們寫的類以及其關聯的類。

那么如何實現呢?一個很簡單的做法就是 JVM 提供一個全局類加載器的設置接口,這樣我們直接替換全局類加載器就行了,但是這樣無法解決多個自定義類加載器同時存在的問題。

實際上 JVM 提供了一種非常簡單有效的方式,我把它稱為類加載傳導規則:JVM 會選擇當前類的類加載器來加載所有該類的引用的類。例如我們定義了 TestA 和 TestB 兩個類,TestA 會引用 TestB,只要我們使用自定義的類加載器加載 TestA,那么在運行時,當 TestA 調用到 TestB 的時候,TestB 也會被 JVM 使用 TestA 的類加載器加載。依此類推,只要是 TestA 及其引用類關聯的所有 jar 包的類都會被自定義類加載器加載。通過這種方式,我們只要讓模塊的 main 方法類使用不同的類加載器加載,那么每個模塊的都會使用 main 方法類的類加載器加載的,這樣就能讓多個模塊分別使用不同類加載器。這也是 OSGi 和 SofaArk 能夠實現類隔離的核心原理。

了解了類隔離的實現原理之后,我們從重寫類加載器開始進行實操。要實現自己的類加載器,首先讓自定義的類加載器繼承 java.lang.ClassLoader,然后重寫類加載的方法,這里我們有兩個選擇,一個是重寫 findClass(String name),一個是重寫 loadClass(String name)。那么到底應該選擇哪個?這兩者有什么區別?

下面我們分別嘗試重寫這兩個方法來實現自定義類加載器。

1 重寫 findClass

首先我們定義兩個類,TestA 會打印自己的類加載器,然后調用 TestB 打印它的類加載器,我們預期是實現重寫了 findClass 方法的類加載器 MyClassLoaderParentFirst 能夠在加載了 TestA 之后,讓 TestB 也自動由 MyClassLoaderParentFirst 來進行加載。

  1. public class TestA { 
  2.  
  3.     public static void main(String[] args) { 
  4.         TestA testA = new TestA(); 
  5.         testA.hello(); 
  6.     } 
  7.  
  8.     public void hello() { 
  9.         System.out.println("TestA: " + this.getClass().getClassLoader()); 
  10.         TestB testB = new TestB(); 
  11.         testB.hello(); 
  12.     } 
  13.  
  14. public class TestB { 
  15.  
  16.     public void hello() { 
  17.         System.out.println("TestB: " + this.getClass().getClassLoader()); 
  18.     } 

然后重寫一下 findClass 方法,這個方法先根據文件路徑加載 class 文件,然后調用 defineClass 獲取 Class 對象。

  1. public class MyClassLoaderParentFirst extends ClassLoader{ 
  2.  
  3.     private Map<String, String> classPathMap = new HashMap<>(); 
  4.  
  5.     public MyClassLoaderParentFirst() { 
  6.         classPathMap.put("com.java.loader.TestA""/Users/hansong/IdeaProjects/OhMyJava/CodeRepository/target/classes/com/java/loader/TestA.class"); 
  7.         classPathMap.put("com.java.loader.TestB""/Users/hansong/IdeaProjects/OhMyJava/CodeRepository/target/classes/com/java/loader/TestB.class"); 
  8.     } 
  9.  
  10.     // 重寫了 findClass 方法 
  11.     @Override 
  12.     public Class<?> findClass(String name) throws ClassNotFoundException { 
  13.         String classPath = classPathMap.get(name); 
  14.         File file = new File(classPath); 
  15.         if (!file.exists()) { 
  16.             throw new ClassNotFoundException(); 
  17.         } 
  18.         byte[] classBytes = getClassData(file); 
  19.         if (classBytes == null || classBytes.length == 0) { 
  20.             throw new ClassNotFoundException(); 
  21.         } 
  22.         return defineClass(classBytes, 0, classBytes.length); 
  23.     } 
  24.  
  25.     private byte[] getClassData(File file) { 
  26.         try (InputStream ins = new FileInputStream(file); ByteArrayOutputStream baos = new 
  27.                 ByteArrayOutputStream()) { 
  28.             byte[] buffer = new byte[4096]; 
  29.             int bytesNumRead = 0; 
  30.             while ((bytesNumRead = ins.read(buffer)) != -1) { 
  31.                 baos.write(buffer, 0, bytesNumRead); 
  32.             } 
  33.             return baos.toByteArray(); 
  34.         } catch (FileNotFoundException e) { 
  35.             e.printStackTrace(); 
  36.         } catch (IOException e) { 
  37.             e.printStackTrace(); 
  38.         } 
  39.         return new byte[] {}; 
  40.     } 

最后寫一個 main 方法調用自定義的類加載器加載 TestA,然后通過反射調用 TestA 的 main 方法打印類加載器的信息。

  1. public class MyTest { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.         MyClassLoaderParentFirst myClassLoaderParentFirst = new MyClassLoaderParentFirst(); 
  5.         Class testAClass = myClassLoaderParentFirst.findClass("com.java.loader.TestA"); 
  6.         Method mainMethod = testAClass.getDeclaredMethod("main", String[].class); 
  7.         mainMethod.invoke(null, new Object[]{args}); 
  8.     } 

執行的結果如下:

  1. TestA: com.java.loader.MyClassLoaderParentFirst@1d44bcfa 
  2. TestB: sun.misc.Launcher$AppClassLoader@18b4aac2 

執行的結果并沒有如我們期待,TestA 確實是 MyClassLoaderParentFirst 加載的,但是 TestB 還是 AppClassLoader 加載的。這是為什么呢?

要回答這個問題,首先是要了解一個類加載的規則:JVM 在觸發類加載時調用的是 ClassLoader.loadClass 方法。這個方法的實現了雙親委派:

  • 委托給父加載器查詢
  • 如果父加載器查詢不到,就調用 findClass 方法進行加載

明白了這個規則之后,執行的結果的原因就找到了:JVM 確實使用了MyClassLoaderParentFirst 來加載 TestB,但是因為雙親委派的機制,TestB 被委托給了 MyClassLoaderParentFirst 的父加載器 AppClassLoader 進行加載。

你可能還好奇,為什么 MyClassLoaderParentFirst 的父加載器是 AppClassLoader?因為我們定義的 main 方法類默認情況下都是由 JDK 自帶的 AppClassLoader 加載的,根據類加載傳導規則,main 類引用的 MyClassLoaderParentFirst 也是由加載了 main 類的AppClassLoader 來加載。由于 MyClassLoaderParentFirst 的父類是 ClassLoader,ClassLoader 的默認構造方法會自動設置父加載器的值為 AppClassLoader。

  1. protected ClassLoader() { 
  2.     this(checkCreateClassLoader(), getSystemClassLoader()); 

2 重寫 loadClass

由于重寫 findClass 方法會受到雙親委派機制的影響導致 TestB 被 AppClassLoader 加載,不符合類隔離的目標,所以我們只能重寫 loadClass 方法來破壞雙親委派機制。代碼如下所示:

  1. public class MyClassLoaderCustom extends ClassLoader { 
  2.  
  3.     private ClassLoader jdkClassLoader; 
  4.  
  5.     private Map<String, String> classPathMap = new HashMap<>(); 
  6.  
  7.     public MyClassLoaderCustom(ClassLoader jdkClassLoader) { 
  8.         this.jdkClassLoader = jdkClassLoader; 
  9.         classPathMap.put("com.java.loader.TestA""/Users/hansong/IdeaProjects/OhMyJava/CodeRepository/target/classes/com/java/loader/TestA.class"); 
  10.         classPathMap.put("com.java.loader.TestB""/Users/hansong/IdeaProjects/OhMyJava/CodeRepository/target/classes/com/java/loader/TestB.class"); 
  11.     } 
  12.  
  13.     @Override 
  14.     protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { 
  15.         Class result = null
  16.         try { 
  17.             //這里要使用 JDK 的類加載器加載 java.lang 包里面的類 
  18.             result = jdkClassLoader.loadClass(name); 
  19.         } catch (Exception e) { 
  20.             //忽略 
  21.         } 
  22.         if (result != null) { 
  23.             return result; 
  24.         } 
  25.         String classPath = classPathMap.get(name); 
  26.         File file = new File(classPath); 
  27.         if (!file.exists()) { 
  28.             throw new ClassNotFoundException(); 
  29.         } 
  30.  
  31.         byte[] classBytes = getClassData(file); 
  32.         if (classBytes == null || classBytes.length == 0) { 
  33.             throw new ClassNotFoundException(); 
  34.         } 
  35.         return defineClass(classBytes, 0, classBytes.length); 
  36.     } 
  37.  
  38.     private byte[] getClassData(File file) { //省略 } 
  39.  

這里注意一點,我們重寫了 loadClass 方法也就是意味著所有類包括 java.lang 包里面的類都會通過 MyClassLoaderCustom 進行加載,但類隔離的目標不包括這部分 JDK 自帶的類,所以我們用 ExtClassLoader 來加載 JDK 的類,相關的代碼就是:result = jdkClassLoader.loadClass(name);

測試代碼如下:

  1. public class MyTest { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.         //這里取AppClassLoader的父加載器也就是ExtClassLoader作為MyClassLoaderCustom的jdkClassLoader 
  5.         MyClassLoaderCustom myClassLoaderCustom = new MyClassLoaderCustom(Thread.currentThread().getContextClassLoader().getParent()); 
  6.         Class testAClass = myClassLoaderCustom.loadClass("com.java.loader.TestA"); 
  7.         Method mainMethod = testAClass.getDeclaredMethod("main", String[].class); 
  8.         mainMethod.invoke(null, new Object[]{args}); 
  9.     } 

執行結果如下:

  1. TestA: com.java.loader.MyClassLoaderCustom@1d44bcfa 
  2. TestB: com.java.loader.MyClassLoaderCustom@1d44bcfa 

可以看到,通過重寫了 loadClass 方法,我們成功的讓 TestB 也使用MyClassLoaderCustom 加載到了 JVM 中。

三 總結

類隔離技術是為了解決依賴沖突而誕生的,它通過自定義類加載器破壞雙親委派機制,然后利用類加載傳導規則實現了不同模塊的類隔離。

參考資料

深入探討 Java 類加載器(https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html)

 

責任編輯:武曉燕 來源: 阿里技術
相關推薦

2022-08-08 08:17:43

類隔離加載器自定義類

2024-09-26 00:01:00

Java類隔離規避依賴沖突

2019-03-05 14:59:42

Java虛擬機加載類

2021-07-05 06:51:43

Java機制類加載器

2025-06-26 03:33:00

2019-12-09 15:08:30

JavaTomcatWeb

2023-10-19 09:14:34

Java開發

2017-04-03 21:52:30

隔離線程池分布式

2012-02-09 10:31:17

Java

2010-09-25 13:43:17

交換機端口隔離

2024-04-09 08:41:41

JVM類加載Java

2022-10-19 09:27:39

2020-10-13 10:32:24

MySQL事務MVCC

2021-09-07 10:33:42

MySQL事務隔離性

2022-01-04 10:25:32

Go參數加載

2012-11-06 10:19:18

Java自定義加載Java類

2011-02-25 09:23:00

Java類加載器

2010-03-18 14:16:52

Java Thread

2023-01-28 10:40:56

Java虛擬機代碼

2024-08-28 08:48:20

Linux資源隔離
點贊
收藏

51CTO技術棧公眾號

国内精品在线观看视频| 日本三级久久久| 国产高清av片| 91色在线看| 久久久亚洲午夜电影| 国产精品美女无圣光视频| 国产极品国产极品| 丝袜美腿综合| 91精品国产综合久久香蕉麻豆| 日韩一级特黄毛片| 美女毛片在线看| 国产乱子轮精品视频| 91爱视频在线| 亚洲欧美精品aaaaaa片| 日韩欧美黄色| 欧美一区二区三区在线视频| 免费观看日韩毛片| 高h视频在线观看| 91麻豆精品一区二区三区| 国产999在线观看| 九九九免费视频| 日韩综合网站| 亚洲精品视频免费在线观看| 亚洲三级在线视频| 亚洲综合av一区二区三区| 亚洲综合成人在线视频| 亚洲国产精品久久久久久女王| 人妻视频一区二区三区| 精品一区二区三区在线观看国产| 欧美中文字幕视频在线观看| 欧美日韩免费做爰视频| 成人影视亚洲图片在线| 国产丝袜高跟一区| 人妻 日韩 欧美 综合 制服| 国产精品亚洲四区在线观看| 欧美伊人久久久久久久久影院| 黄页免费在线观看视频| 超碰公开在线| 亚洲欧洲日产国码二区| 日韩视频在线播放| 四虎影院在线域名免费观看| 国产成人av影院| 91最新在线免费观看| 中文字幕 国产精品| 亚洲综合精品四区| 国内伊人久久久久久网站视频| 天天综合天天做| 久久理论电影| 中文字幕日韩av| 天天躁夜夜躁狠狠是什么心态| 女同久久另类99精品国产| 欧美刺激脚交jootjob| 亚洲三级在线视频| 日韩精品视频一区二区三区| 3d成人h动漫网站入口| 日本超碰在线观看| 欧美激情三区| 欧美日韩高清一区二区三区| 亚洲精品久久久久久宅男| 成人亚洲综合| 欧美片网站yy| 色综合五月婷婷| 欧美在线在线| 亚洲高清色综合| 中文字幕精品视频在线| 欧美亚洲国产日韩| 亚洲精品天天看| 国产成人精品无码免费看夜聊软件| 婷婷精品在线| 夜夜嗨av一区二区三区四区| 亚洲国产精品一区二区久久hs| 青青草原综合久久大伊人精品| 揄拍成人国产精品视频| 亚洲a∨无码无在线观看| 国产精品久久久久久久免费观看 | 日韩欧美在线观看一区二区| 91社区在线播放| 欧美激情一区二区三区在线视频| 国产在线91| 日韩理论片中文av| 欧美乱做爰xxxⅹ久久久| 国产啊啊啊视频在线观看| 红桃av永久久久| 天堂在线资源视频| 欧美影院精品| 亚洲精品视频网上网址在线观看| 色综合99久久久无码国产精品| 国产精品久久久久久麻豆一区软件| 欧美精品在线观看| 国产成人综合欧美精品久久| 日本欧美一区二区| 99久久99| 国产天堂在线| 亚洲精品自拍动漫在线| 日韩精品―中文字幕| 99只有精品| 亚洲成人激情图| 四虎影视1304t| 国内精品久久久久久久影视麻豆| 国产成人一区二区在线| 国产高清精品软件丝瓜软件| www欧美成人18+| 99热都是精品| 成人欧美大片| 日韩女优av电影在线观看| 亚洲天堂视频一区| 欧美在线免费| 国产精品国产自产拍高清av水多 | 亚洲精品偷拍视频| 九色porny丨国产首页在线| 欧美特级限制片免费在线观看| 99热这里只有精品2| 国产91精品对白在线播放| 欧美成人精品一区二区| 日韩黄色片网站| 波多野结衣在线一区| 精品少妇人妻av一区二区| 色综合亚洲图丝熟| 日韩精品中文字幕一区 | 亚洲精品成人悠悠色影视| 日本中文字幕片| 爱高潮www亚洲精品| 一色桃子一区二区| 91玉足脚交嫩脚丫在线播放| 国产精品一区三区| 亚洲最大免费| 99精品在免费线偷拍| 亚洲精品久久久久久久久久久久久 | 肥臀熟女一区二区三区| 最新日韩在线视频| 五月婷婷激情久久| 婷婷综合成人| 97在线日本国产| 成人1区2区3区| 中文字幕欧美一| 第四色婷婷基地| 久9久9色综合| 国产999在线观看| 日本一本草久在线中文| 亚洲国产视频网站| 波多野结衣电影免费观看| 欧美疯狂party性派对| 国产成人精品电影久久久| 天堂中文在线8| 亚洲高清不卡在线观看| 国产调教打屁股xxxx网站| 亚洲电影影音先锋| 91亚洲一区精品| 91网址在线观看| 91精品欧美一区二区三区综合在| 人与动物性xxxx| 理论片日本一区| 亚洲国产另类久久久精品极度| 香蕉成人av| 亚洲最大在线视频| 国产精品露脸视频| 国产精品久久一级| 亚洲精品在线视频播放| 亚洲欧洲美洲一区二区三区| 1卡2卡3卡精品视频| 午夜激情在线| 亚洲精品一区二区三区影院| 日韩精品视频免费看| 99久久精品国产毛片| 欧美黄网站在线观看| 国产一区二区在线| 国产精品视频免费在线观看| 蜜桃视频在线观看免费视频网站www| 欧美精品一二三四| 午夜写真片福利电影网| 粉嫩绯色av一区二区在线观看 | 亚洲第一天堂无码专区| 日韩欧美视频在线免费观看| 久久综合成人精品亚洲另类欧美| 久久人妻精品白浆国产| 日韩成人精品一区| 91亚洲永久免费精品| 黄色美女视频在线观看| 日韩精品在线观看视频| 老熟妇一区二区三区啪啪| 亚洲三级久久久| 一级黄色片毛片| 日韩极品在线观看| 好吊色这里只有精品| 精品少妇一区| 国产精品亚发布| 免费电影网站在线视频观看福利| 亚洲第一区在线观看| 国产九色91回来了| 亚洲最新在线观看| 亚洲成人黄色av| 国产精品亚洲专一区二区三区| 久久国产成人精品国产成人亚洲| 精品国产91| 国产不卡一区二区三区在线观看| 成人欧美magnet| 欧美另类第一页| 川上优的av在线一区二区| 日韩视频在线永久播放| 亚洲AV无码成人精品区东京热| 国产精品久99| 国产精品无码网站| 狠狠色综合色综合网络| 日日碰狠狠添天天爽超碰97| 欧美电影免费| 欧美二区三区| 8x国产一区二区三区精品推荐| 日韩美女写真福利在线观看| 中文字幕在线观看网站| 中国人与牲禽动交精品| 日韩中文字幕免费在线观看| 欧美日韩综合在线免费观看| 日韩av一区二区在线播放| 国产精品灌醉下药二区| 给我看免费高清在线观看| 国产精品一区免费在线观看| 亚洲精品一二三四五区| 亚洲理论在线| 日本免费成人网| 国产精品7m凸凹视频分类| 欧洲亚洲一区| 秋霞影院一区二区三区| 成人激情直播| 成人久久精品| 国产精品丝袜视频| 欧美7777| 38少妇精品导航| 国产蜜臀一区二区打屁股调教| 色噜噜狠狠色综合网图区| 黄色片在线免费观看| 亚洲精品xxx| 污视频在线免费| 精品福利av导航| 国产免费久久久| 在线播放视频一区| 97超碰资源站| 欧美日韩精品欧美日韩精品一综合| 无码人妻黑人中文字幕| 欧美日韩国产一中文字不卡| 国产精彩视频在线| 亚洲一区二区三区三| 国产亚洲小视频| 亚洲一区二区三区四区在线观看| 激情小说中文字幕| 亚洲一区国产视频| 久久久久久国产精品免费播放| 亚洲欧美电影院| 永久看片925tv| 亚洲一区二区三区免费视频| 久久久久亚洲AV| 亚洲成a人片在线不卡一二三区| 久久久全国免费视频| 亚洲第一福利一区| 在线能看的av| 在线视频观看一区| 中文字幕在线观看精品| 欧美日韩精品是欧美日韩精品| 一二三区中文字幕| 欧美一区二区精品在线| www.com日本| 波多野结衣在线观看一区| 金瓶狂野欧美性猛交xxxx| 日韩国产精品久久久久久亚洲| 欧美精品尤物在线| 久草在线成人| 影音欧美亚洲| 午夜日韩视频| heyzo国产| 蜜臀久久99精品久久久久宅男| 欧美日韩精品区别| 国产成人高清视频| 亚洲 欧美 日韩在线| 欧美韩国日本| 国产成人综合av| 亚洲人体在线| 国产日韩一区欧美| 少妇一区二区视频| 日本一区二区三区四区五区六区| 欧美性色综合| 日本va中文字幕| 精品一区二区在线视频| 交换做爰国语对白| 99国产精品一区| 美女被到爽高潮视频| 国产精品久久久爽爽爽麻豆色哟哟| 97精品在线播放| 亚瑟在线精品视频| 无码人妻av免费一区二区三区| 欧美日韩一区国产| 亚洲欧美另类一区| 欧美成人aa大片| 国产女人爽到高潮a毛片| 精品国产电影一区二区| 黄色小视频在线免费观看| 最近2019年手机中文字幕| 2020国产在线| 国产精品露脸自拍| 久久亚洲精品人成综合网| 国产高清在线精品一区二区三区| 日韩高清电影免费| 99re资源| 亚洲激情播播| 亚洲小说欧美另类激情| 久久天堂精品| 黄色片子免费看| 久久嫩草精品久久久精品一| 久久免费精彩视频| 欧美色图在线视频| 国产又粗又猛又爽| 亚洲天堂男人天堂女人天堂| а√资源新版在线天堂| 992tv成人免费视频| 成人国产精品| 国产精品一区在线播放| 婷婷久久一区| 国产精品第12页| 99精品在线免费| 亚洲一级生活片| 欧美日韩一区 二区 三区 久久精品| 99久久99久久久精品棕色圆| 亚洲欧美成人网| sm在线播放| 亚洲综合在线小说| 成人影院在线| 成人综合视频在线| 国产在线精品一区二区不卡了| 国产又粗又黄又猛| 天天综合网天天综合色| 97人妻精品一区二区三区软件 | 国产精品xxxxxx| 亚洲成人黄色在线观看| 黄网址在线观看| 国产精品嫩草影院久久久| 国产伦理久久久久久妇女 | 欧美精品一区二区三区精品| 久久精品xxx| 国产成人免费视| 国产又粗又猛又爽又黄的视频四季| 精品日本美女福利在线观看| 蜜臀av在线观看| 欧美高清视频在线播放| 亚洲日本网址| 日韩wuma| 香蕉久久国产| 亚洲a v网站| 精品动漫一区二区三区| 精品久久人妻av中文字幕| 久久99热精品| 久久精品免视看国产成人| 日本三级中文字幕在线观看| 蜜臀va亚洲va欧美va天堂| 波多野结衣av在线观看| 色婷婷久久久亚洲一区二区三区| 欧美自拍第一页| 久久久久久国产精品三级玉女聊斋| 伊人久久大香伊蕉在人线观看热v| 色视频一区二区三区| 久久激情五月婷婷| 色偷偷www8888| 欧美成人高清电影在线| 亚洲图区一区| 国产精品乱子乱xxxx| 亚洲伦理精品| 先锋资源av在线| 欧美性猛交99久久久久99按摩| 日韩中文字幕免费观看| 久久久久久久色| 一区二区小说| 手机在线免费观看毛片| 中文字幕一区二区三区不卡在线| 在线观看中文字幕2021| 亚洲图片在区色| www.成人在线.com| 精品无码av无码免费专区| 粉嫩一区二区三区在线看| 日韩精品一区三区| 亚洲热线99精品视频| 国产a亚洲精品| 在线观看成人av| av一区二区久久| 日韩在线 中文字幕| 日韩一区二区三区国产| 亚洲开心激情| 久章草在线视频| 国产精品成人网| 亚洲国产精品久久人人爱潘金莲| 秋霞成人午夜鲁丝一区二区三区| 九九久久婷婷| 乳色吐息在线观看| 午夜日韩在线观看| 懂色av一区二区三区四区| 国产精品狠色婷| 久久久久久影院| 国产熟妇久久777777| 欧美日韩高清在线播放| 性爽视频在线| 亚洲一一在线| 国产成人av电影| 中文字幕+乱码+中文乱码www| 久久久精品欧美|