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

Java反射到底慢在哪?

開發 后端
所以最有可能產生性能差異的只有getMethod和getDeclaredField、invoke和set方法了,下面分別就這兩組方法進行測試,找到具體慢在哪。

 反射具體是怎么影響性能的?這引起了我的反思。是啊,在闡述某個觀點時確實有必要說明原因,并且證明這個觀點是對的,雖然反射影響性能人盡皆知,我曾經也真的研究過反射是否存在性能問題,但并沒有在寫文章的時候詳細說明。這讓我想到網上很多信息只會告訴你結論,并不會說明原因,導致很多學到的東西都是死記硬背,而不是真正掌握,別人一問或者自己親身遇到同樣的問題時,傻眼了。

反射真的存在性能問題嗎?

還是使用上篇文章的demo,為了放大問題,找到共性,采用逐漸擴大測試次數、每次測試多次取平均值的方式,針對同一個方法分別就直接調用該方法、反射調用該方法、直接調用該方法對應的實例、反射調用該方法對應的實例分別從1-1000000,每隔一個數量級測試一次:

測試代碼如下(Person、ICompany、ProgramMonkey這三個類已在之前的文章中貼出): 

  1. public class ReflectionPerformanceActivity extends Activity{  
  2.     private TextView mExecuteResultTxtView = null 
  3.     private EditText mExecuteCountEditTxt = null 
  4.     private Executor mPerformanceExecutor = Executors.newSingleThreadExecutor();  
  5.     private static final int AVERAGE_COUNT = 10 
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState){  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_reflection_performance_layout);  
  10.         mExecuteResultTxtView = (TextView)findViewById(R.id.executeResultTxtId);  
  11.         mExecuteCountEditTxt = (EditText)findViewById(R.id.executeCountEditTxtId);  
  12.     }  
  13.     public void onClick(View v){  
  14.         switch(v.getId()){  
  15.             case R.id.executeBtnId:{  
  16.                 execute();  
  17.             }  
  18.             break;  
  19.             default:{ 
  20.             }  
  21.             break;  
  22.         }  
  23.     }  
  24.     private void execute(){  
  25.         mExecuteResultTxtView.setText("");  
  26.         mPerformanceExecutor.execute(new Runnable(){  
  27.             @Override  
  28.             public void run(){  
  29.                 long costTime = 0 
  30.                 int executeCount = Integer.parseInt(mExecuteCountEditTxt.getText().toString());  
  31.                 long reflectMethodCostTime=0,normalMethodCostTime=0,reflectFieldCostTime=0,normalFieldCostTime=0 
  32.                 updateResultTextView(executeCount + "毫秒耗時情況測試");  
  33.                 for(int index = 0; index < AVERAGE_COUNT; index++){  
  34.                     updateResultTextView("第 " + (index+1) + " 次");  
  35.                     costTime = getNormalCallCostTime(executeCount);  
  36.                     reflectMethodCostTime += costTime;  
  37.                     updateResultTextView("執行直接調用方法耗時:" + costTime + " 毫秒");  
  38.                     costTime = getReflectCallMethodCostTime(executeCount);  
  39.                     normalMethodCostTime += costTime;  
  40.                     updateResultTextView("執行反射調用方法耗時:" + costTime + " 毫秒");  
  41.                     costTime = getNormalFieldCostTime(executeCount);  
  42.                     reflectFieldCostTime += costTime;  
  43.                     updateResultTextView("執行普通調用實例耗時:" + costTime + " 毫秒");  
  44.                     costTime = getReflectCallFieldCostTime(executeCount);  
  45.                     normalFieldCostTime += costTime;  
  46.                     updateResultTextView("執行反射調用實例耗時:" + costTime + " 毫秒");  
  47.                 }  
  48.                 updateResultTextView("執行直接調用方法平均耗時:" + reflectMethodCostTime/AVERAGE_COUNT + " 毫秒");  
  49.                 updateResultTextView("執行反射調用方法平均耗時:" + normalMethodCostTime/AVERAGE_COUNT + " 毫秒");  
  50.                 updateResultTextView("執行普通調用實例平均耗時:" + reflectFieldCostTime/AVERAGE_COUNT + " 毫秒");  
  51.                 updateResultTextView("執行反射調用實例平均耗時:" + normalFieldCostTime/AVERAGE_COUNT + " 毫秒");  
  52.             }  
  53.         });  
  54.     }  
  55.     private long getReflectCallMethodCostTime(int count){  
  56.         long startTime = System.currentTimeMillis();  
  57.         for(int index = 0 ; index < count; index++){  
  58.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  59.             try{  
  60.                 Method setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class);  
  61.                 setmLanguageMethod.setAccessible(true);  
  62.                 setmLanguageMethod.invoke(programMonkey, "Java");  
  63.             }catch(IllegalAccessException e){  
  64.                 e.printStackTrace();  
  65.             }catch(InvocationTargetException e){  
  66.                 e.printStackTrace();  
  67.             }catch(NoSuchMethodException e){  
  68.                 e.printStackTrace();  
  69.             }  
  70.         }  
  71.         return System.currentTimeMillis()-startTime;  
  72.     }  
  73.     private long getReflectCallFieldCostTime(int count){  
  74.         long startTime = System.currentTimeMillis();  
  75.         for(int index = 0 ; index < count; index++){  
  76.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  77.             try{  
  78.                 Field ageField = programMonkey.getClass().getDeclaredField("mLanguage");  
  79.                 ageField.set(programMonkey, "Java");  
  80.             }catch(NoSuchFieldException e){  
  81.                 e.printStackTrace();  
  82.             }catch(IllegalAccessException e){  
  83.                 e.printStackTrace();  
  84.             }  
  85.         }  
  86.         return System.currentTimeMillis()-startTime;  
  87.     }  
  88.     private long getNormalCallCostTime(int count){  
  89.         long startTime = System.currentTimeMillis();  
  90.         for(int index = 0 ; index < count; index++){  
  91.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  92.             programMonkey.setmLanguage("Java");  
  93.         }  
  94.         return System.currentTimeMillis()-startTime;  
  95.     }  
  96.     private long getNormalFieldCostTime(int count){  
  97.         long startTime = System.currentTimeMillis();  
  98.         for(int index = 0 ; index < count; index++){  
  99.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  100.             programMonkey.mLanguage = "Java" 
  101.         }  
  102.         return System.currentTimeMillis()-startTime;  
  103.     }  
  104.     private void updateResultTextView(final String content){  
  105.         ReflectionPerformanceActivity.this.runOnUiThread(new Runnable(){  
  106.             @Override  
  107.             public void run(){  
  108.                 mExecuteResultTxtView.append(content);  
  109.                 mExecuteResultTxtView.append("\n");  
  110.             }  
  111.         });  
  112.     }  

測試結果如下:

反射性能測試結果

測試結論:

  •  反射的確會導致性能問題;
  •  反射導致的性能問題是否嚴重跟使用的次數有關系,如果控制在100次以內,基本上沒什么差別,如果調用次數超過了100次,性能差異會很明顯;
  •  四種訪問方式,直接訪問實例的方式效率最高;其次是直接調用方法的方式,耗時約為直接調用實例的1.4倍;接著是通過反射訪問實例的方式,耗時約為直接訪問實例的3.75倍;最慢的是通過反射訪問方法的方式,耗時約為直接訪問實例的6.2倍;

反射到底慢在哪?

跟蹤源碼可以發現,四個方法中都存在實例化ProgramMonkey的代碼,所以可以排除是這句話導致的不同調用方式產生的性能差異;通過反射調用方法中調用了setAccessible方法,但該方法純粹只是設置屬性值,不會產生明顯的性能差異;所以最有可能產生性能差異的只有getMethod和getDeclaredField、invoke和set方法了,下面分別就這兩組方法進行測試,找到具體慢在哪?

首先測試invoke和set方法,修改getReflectCallMethodCostTime和getReflectCallFieldCostTime方法的代碼如下: 

  1. private long getReflectCallMethodCostTime(int count){  
  2.       long startTime = System.currentTimeMillis();  
  3.       ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  4.       Method setmLanguageMethod = null 
  5.       try{ 
  6.            setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class);  
  7.           setmLanguageMethod.setAccessible(true);  
  8.       }catch(NoSuchMethodException e){  
  9.           e.printStackTrace();  
  10.       }  
  11.       for(int index = 0 ; index < count; index++){  
  12.           try{  
  13.               setmLanguageMethod.invoke(programMonkey, "Java");  
  14.           }catch(IllegalAccessException e){  
  15.               e.printStackTrace();  
  16.           }catch(InvocationTargetException e){  
  17.               e.printStackTrace();  
  18.           }  
  19.       }  
  20.       return System.currentTimeMillis()-startTime;  
  21.   }  
  22.   private long getReflectCallFieldCostTime(int count){  
  23.       long startTime = System.currentTimeMillis();  
  24.       ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  25.       Field ageField = null 
  26.       try{  
  27.           ageField = programMonkey.getClass().getDeclaredField("mLanguage");  
  28.       }catch(NoSuchFieldException e){  
  29.           e.printStackTrace();  
  30.       }  
  31.       for(int index = 0 ; index < count; index++){  
  32.           try{  
  33.               ageField.set(programMonkey, "Java");  
  34.           }catch(IllegalAccessException e){  
  35.               e.printStackTrace();  
  36.           }  
  37.       }  
  38.       return System.currentTimeMillis()-startTime;  
  39.   } 

沿用上面的測試方法,測試結果如下:

invoke和set

修改getReflectCallMethodCostTime和getReflectCallFieldCostTime方法的代碼如下,對getMethod和getDeclaredField進行測試: 

  1. private long getReflectCallMethodCostTime(int count){  
  2.     long startTime = System.currentTimeMillis();  
  3.     ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  4.     for(int index = 0 ; index < count; index++){  
  5.         try{  
  6.             Method setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class);  
  7.         }catch(NoSuchMethodException e){  
  8.             e.printStackTrace();  
  9.         }  
  10.     }  
  11.     return System.currentTimeMillis()-startTime;  
  12.  
  13. private long getReflectCallFieldCostTime(int count){  
  14.     long startTime = System.currentTimeMillis();  
  15.     ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  16.     for(int index = 0 ; index < count; index++){  
  17.         try{  
  18.             Field ageField = programMonkey.getClass().getDeclaredField("mLanguage");  
  19.         }catch(NoSuchFieldException e){  
  20.             e.printStackTrace();  
  21.         } 
  22.     }  
  23.     return System.currentTimeMillis()-startTime; 

沿用上面的測試方法,測試結果如下:

getMethod和getDeclaredField

測試結論:

  •  getMethod和getDeclaredField方法會比invoke和set方法耗時;
  •  隨著測試數量級越大,性能差異的比例越趨于穩定;

由于測試的這四個方法最終調用的都是native方法,無法進一步跟蹤。個人猜測應該是和在程序運行時操作class有關,比如需要判斷是否安全?是否允許這樣操作?入參是否正確?是否能夠在虛擬機中找到需要反射的類?主要是這一系列判斷條件導致了反射耗時;也有可能是因為調用natvie方法,需要使用JNI接口,導致了性能問題(參照Log.java、System.out.println,都是調用native方法,重復調用多次耗時很明顯)。

如果避免反射導致的性能問題? 

通過上面的測試可以看出,過多地使用反射,的確會存在性能問題,但如果使用得當,所謂反射導致性能問題也就不是問題了,關于反射對性能的影響,參照下面的使用原則,并不會有什么明顯的問題:

  •  不要過于頻繁地使用反射,大量地使用反射會帶來性能問題;
  •  通過反射直接訪問實例會比訪問方法快很多,所以應該優先采用訪問實例的方式。

后記

上面的測試并不全面,但在一定程度上能夠反映出反射的確會導致性能問題,也能夠大概知道是哪個地方導致的問題。如果后面有必要進一步測試,我會從下面幾個方面作進一步測試:

  •  測試頻繁調用native方法是否會有明顯的性能問題;
  •  測試同一個方法內,過多的條件判斷是否會有明顯的性能問題;
  •  測試類的復雜程度是否會對反射的性能有明顯影響 

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2024-04-15 04:00:00

C#反射代碼

2024-06-04 00:00:30

C#反射編程

2016-12-28 11:28:19

.NET反射

2021-02-26 07:17:47

MySQLMariaDB

2014-01-07 13:54:40

Hadoop日志

2025-10-29 00:00:00

光通信AI人工智能

2024-11-05 09:32:47

2017-06-22 16:18:58

IBM光譜存儲軟件定義存儲

2020-12-31 09:06:44

Go語言Reflect

2015-09-02 09:56:33

大數據

2024-04-11 13:23:07

2020-04-30 11:11:30

MySQLMGR數據庫

2015-06-30 14:33:52

物聯網

2012-09-13 14:11:07

Windows Ser微軟云平臺

2020-08-06 09:08:51

開發谷歌微軟

2021-10-08 14:43:24

WiFi 5WiFi 6遠程

2023-06-27 17:30:13

數字化

2017-03-16 14:31:11

2025-05-22 09:15:09

2022-03-29 14:46:03

元宇宙工業元宇宙物聯網
點贊
收藏

51CTO技術棧公眾號

精品无码人妻一区二区三区品| 美脚丝袜脚交一区二区| 中文永久免费观看| 图片小说视频色综合| 日韩欧美亚洲国产另类| 久久久一本二本三本| 3p视频在线观看| 成人性生交大片免费看中文| 国产精品27p| 在线免费日韩av| 青青草久久爱| 欧美一区二区三区四区久久| 黄色一级片播放| 国产一二三区在线观看| 久久综合久久久久88| 91人人爽人人爽人人精88v| 日韩三级免费看| 伊人久久大香线蕉综合四虎小说| 亚洲精品videossex少妇| the porn av| 欧美极品videos大乳护士| 亚洲欧美在线视频| 欧洲精品亚洲精品| 亚洲美女福利视频| 捆绑调教美女网站视频一区| 午夜精品久久久久久久99热浪潮 | 成人av网址在线| 国产精品丝袜一区二区三区| 特一级黄色大片| 欧美fxxxxxx另类| 中文字幕亚洲欧美一区二区三区| 国产成人精品无码片区在线| 国产精品**亚洲精品| 在线视频国内自拍亚洲视频| 国产日韩欧美精品在线观看| 成人在线免费看片| 国产激情视频在线看| 亚洲国产欧美国产综合一区| 日韩天堂在线视频| 麻豆国产精品一区| 都市激情亚洲| 精品久久久网站| 亚洲一二区在线观看| 国产欧美自拍| 欧美午夜一区二区三区| 色欲av无码一区二区人妻| 国产后进白嫩翘臀在线观看视频| 亚洲三级电影全部在线观看高清| 亚洲一卡二卡三卡| 北岛玲一区二区三区| www一区二区| 国产一区二区三区四区五区在线| 精品国精品国产自在久不卡| 紧缚捆绑精品一区二区| 成人精品久久久| 在线观看国产精品视频| 青青青爽久久午夜综合久久午夜| 日本一本a高清免费不卡| 久久一区二区三区视频| 亚洲欧美卡通另类91av| 欧美怡红院视频一区二区三区 | 俄罗斯一级**毛片在线播放| 亚洲天堂av一区| 亚洲欧美一二三| a级网站在线播放| 欧美国产亚洲另类动漫| 成人性色av| 人妻va精品va欧美va| 成年人国产精品| 久久久久se| 飘雪影视在线观看免费观看 | 精品欧美久久久| 91精产国品一二三| 国产调教精品| 亚洲精品色婷婷福利天堂| 无码h肉动漫在线观看| 亚洲妇女av| 自拍亚洲一区欧美另类| 波多野结衣喷潮| 欧美 日韩 国产 一区| 欧美激情一区二区三区成人| 久久国产精品系列| 久久久久在线| 国产欧美精品久久久| aa视频在线免费观看| 国产成人黄色| 国产欧美精品一区| 中文字幕一区二区中文字幕| 国产在线二区| 黄色91在线观看| 在线视频日韩一区| 99久久久国产精品免费调教网站| 欧美日韩色综合| 中文字幕久久av| 国产毛片精品| 国产香蕉97碰碰久久人人| 日本黄色录像视频| 99精品视频免费观看| 国产精品老牛影院在线观看| 成人黄色在线观看视频| 久久色在线观看| av磁力番号网| 欧美日韩免费看片| 日韩欧美你懂的| 久久夜精品va视频免费观看| 少妇免费毛片久久久久久久久| 搞黄视频在线观看| 亚洲一区二区三区四区在线免费观看 | 日韩午夜电影网| 久久久亚洲网站| 欧美高清69hd| eeuss国产一区二区三区 | 亚洲成年人av| 成人在线亚洲| 91精品国产高清久久久久久91| 中文字幕在线播放av| 暴力调教一区二区三区| 91制片厂免费观看| 欧美日韩视频免费观看| 精品国产一区二区亚洲人成毛片| 91狠狠综合久久久久久| 99国产精品视频免费观看一公开 | 久久久免费av| 国产精品无码天天爽视频| 久久九九影视网| 亚洲人成无码网站久久99热国产| 欧洲午夜精品| 国产亚洲精品91在线| 欧美亚洲天堂网| 国精产品一区一区三区mba视频 | 国产精品日日摸夜夜添夜夜av| 国内老熟妇对白hdxxxx| 国产精品欧美久久久久无广告 | 91视频免费在线看| 久久精品国产第一区二区三区| 蜜桃久久影院| а√天堂资源官网在线资源| 日韩久久精品一区| 国产高清视频免费在线观看| 日本va欧美va精品| 欧美日韩在线一二三| 黄在线观看免费网站ktv| 日韩精品一区二区在线观看| 97在线观看免费高| 久久国产夜色精品鲁鲁99| 欧洲av一区| 欧美××××黑人××性爽| 精品亚洲一区二区三区在线观看| 国产稀缺真实呦乱在线| 成人一级片在线观看| 白白操在线视频| 99re8这里有精品热视频免费 | 精品国产亚洲一区二区三区在线观看| 911国产在线| 麻豆精品在线视频| 亚洲午夜精品一区二区三区| 欧美一级网址| 自拍偷拍亚洲欧美| 99久久亚洲精品日本无码| 亚洲欧洲99久久| 欧美日韩免费高清一区色橹橹| 成人做爰69片免费| 亚洲毛片播放| 欧美一区免费视频| 8av国产精品爽爽ⅴa在线观看 | 亚洲a级在线播放观看| 素人av在线| 7777精品伊人久久久大香线蕉最新版| 国产精品国产三级国产传播| 国产在线播精品第三| 26uuu成人| y111111国产精品久久久| 97国产一区二区精品久久呦| 桃花色综合影院| 欧美综合在线视频| 三级黄色在线观看| 国产高清无密码一区二区三区| 亚洲人成无码网站久久99热国产| 国产精品免费大片| 国产精品久久久久久久久久尿| 麻豆视频在线观看免费网站| 精品国产不卡一区二区三区| 天码人妻一区二区三区在线看| 国产欧美精品一区aⅴ影院| 樱花草www在线| 亚洲大胆在线| 日韩欧美亚洲日产国产| 欧美日本三级| 欧美在线视频网站| 黄色在线播放网站| 日韩国产精品视频| 一级日韩一级欧美| 精品久久久久国产| 国精产品视频一二二区| 国产69精品久久99不卡| 一级黄色香蕉视频| 欧美日韩a区| 日韩三级电影| 都市激情亚洲| 成人精品久久av网站| 亚洲妇女成熟| 欧美丰满少妇xxxx| wwwxxx在线观看| 亚洲成人网在线| 国产精品久久久久久免费播放| 午夜日韩在线电影| 黄色录像二级片| 久久婷婷国产综合精品青草| 国产一级片中文字幕| 日韩高清一区在线| 日韩av新片网| 午夜影院欧美| 久久久91精品国产一区二区三区| 国产视频1区2区3区| 国产日本精品| 国产亚洲精品久久久久久久| 激情综合网站| 久久久久无码国产精品一区| 免费观看亚洲天堂| 国产精品手机播放| 亚洲黄色中文字幕| 欧美精品videosex极品1| 日本在线视频网| 国产亚洲精品久久久久久牛牛| 日韩一级片免费在线观看| 91精品国产乱码久久蜜臀| 波多野结衣影片| 黑人巨大精品欧美一区二区免费 | 色999日韩国产欧美一区二区| 久久国产精品波多野结衣| 国产精品久久久久一区二区三区共| 国产视频久久久久久| 国产不卡高清在线观看视频| 日本高清免费在线视频| 久久av资源网| 亚洲va在线va天堂va偷拍| 日韩电影在线观看一区| 国产精品亚洲二区在线观看| 99国产精品久久久久久久| 给我免费播放片在线观看| 国产精品第十页| 国产1区2区3区中文字幕| 中文精品久久| 亚洲啊啊啊啊啊| 欧美成人首页| 男人天堂a在线| 亚洲午夜视频| 日本在线xxx| 国产视频一区免费看| 精品一区二区中文字幕| 美女黄网久久| 青青在线视频免费| 免费亚洲电影在线| 免费一区二区三区在线观看 | 91精品国产综合久久香蕉922| av成人免费看| 成人国产精品免费视频| 精品中文字幕一区二区三区四区| 亚洲自拍中文字幕| 99re8这里有精品热视频8在线| 国产成人av一区二区三区| 风间由美性色一区二区三区四区| 国产一区二区视频在线免费观看| 激情亚洲另类图片区小说区| 久热这里只精品99re8久 | 国产av人人夜夜澡人人爽麻豆| 国产精品黄色| 六月丁香激情网| 奇米精品一区二区三区在线观看 | 久久先锋影音av鲁色资源网| 午夜理伦三级做爰电影| 欧美经典一区二区| 午夜剧场免费在线观看| 亚洲激情中文1区| 97超碰人人干| 欧美性大战xxxxx久久久| 91成品人影院| 亚洲第一精品自拍| 丁香婷婷在线| 精品自拍视频在线观看| 毛片在线网站| 91精品久久久久久久久久久久久久 | 九九九伊在人线综合| 日韩天堂在线视频| 精品三级久久| 国产日韩欧美日韩大片| www.豆豆成人网.com| 色一情一乱一伦一区二区三区 | 欧美国产亚洲视频| 国产欧美一区二区三区精品酒店| 国产欧美日韩中文字幕| 99久久人爽人人添人人澡| 欧洲精品国产| 亚洲国产精品第一区二区| 日本熟妇人妻中出| 成人一级片网址| 中国1级黄色片| 亚洲3atv精品一区二区三区| 中文字幕有码视频| 日韩不卡在线观看| a级在线观看| 国产精品欧美激情| 青草久久视频| 亚洲激情免费视频| 日韩黄色在线观看| 国产综合内射日韩久| 中文字幕免费不卡在线| 欧美人妻一区二区| 欧美亚日韩国产aⅴ精品中极品| 亚洲精品一区二区三区四区| 日韩专区在线观看| 韩国美女久久| 国产一区不卡在线观看| 91精品一区二区三区综合在线爱 | 国产在线视频不卡二| 成人免费看aa片| 亚洲一区二区三区四区中文字幕| 亚洲在线精品视频| 亚洲大全视频| 成人性视频欧美一区二区三区| 国产不卡在线视频| 黄色香蕉视频在线观看| 欧美性xxxxxx少妇| 蜜桃视频在线观看视频| 性欧美激情精品| 亚洲国产视频二区| 亚洲 欧洲 日韩| 日韩av电影一区| a毛片毛片av永久免费| 婷婷六月综合网| 女人18毛片一区二区三区| 美女少妇精品视频| 国产精品va视频| 这里只有精品66| 激情伊人五月天久久综合| 日本高清黄色片| 欧美特级限制片免费在线观看| 日本不卡免费播放| 55夜色66夜色国产精品视频| 国产伦精品一区二区三区在线播放| 狠狠噜天天噜日日噜| 精品亚洲porn| 日本青青草视频| 日韩欧美国产不卡| 怡红院av在线| 成人av免费看| 极品日韩av| 在线免费看黄色片| 亚洲www啪成人一区二区麻豆| 好男人在线视频www| 久久免费视频在线| 欧美亚洲色图校园春色| 欧美v在线观看| 国产欧美一区二区三区鸳鸯浴 | 精品少妇一区二区三区在线视频| 国产原创视频在线观看| 91精品国产高清久久久久久91裸体 | 天天爽夜夜爽夜夜爽精品| 日韩成人激情在线| 国产日韩另类视频一区| 天天综合狠狠精品| 精品在线免费视频| 毛片aaaaa| 日韩av在线网站| 99久久伊人| 久久综合亚洲精品| 91欧美激情一区二区三区成人| 无码人妻丰满熟妇区五十路| 在线国产精品视频| 久久的色偷偷| 热99这里只有精品| 国产三级一区二区| 国产乱叫456在线| 97精品国产97久久久久久春色| 亚洲男人都懂第一日本| 精品久久久99| 亚洲成人1区2区| 国产一二在线观看| 91天堂在线视频| 一本久道久久综合狠狠爱| 国产伦精品一区二区三区视频女| 欧美丰满高潮xxxx喷水动漫| 蜜桃传媒在线观看免费进入 | 天堂网在线播放| 国产精品爱啪在线线免费观看| 欧美日韩在线网站| 亚洲午夜精品在线观看| 一本色道久久加勒比精品| 日本在线人成| 国产一区自拍视频| 奇米影视在线99精品| 久久久综合久久久| 伊人久久精品视频| 99re6热只有精品免费观看| 免费激情视频在线观看| 依依成人精品视频| 国产永久免费高清在线观看视频| 亚洲aa在线观看| 日韩电影在线免费| 国产一国产二国产三|