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

Java反射機制應用實踐

開發 后端
Java反射機制是一個非常強大的功能,在很多大型項目比如Spring, Mybatis中都可以看見反射的身影。通過反射機制我們可以在運行期間獲取對象的類型信息,利用這一特性我們可以實現工廠模式和代理模式等設計模式,同時也可以解決Java泛型擦除等令人苦惱的問題。本文我們就從實際應用的角度出發,來應用一下Java的反射機制。

[[191526]]

引言

Java反射機制是一個非常強大的功能,在很多大型項目比如Spring, Mybatis中都可以看見反射的身影。通過反射機制我們可以在運行期間獲取對象的類型信息,利用這一特性我們可以實現工廠模式和代理模式等設計模式,同時也可以解決Java泛型擦除等令人苦惱的問題。本文我們就從實際應用的角度出發,來應用一下Java的反射機制。

反射基礎

p.s: 本文需要讀者對反射機制的API有一定程度的了解,如果之前沒有接觸過的話,建議先看一下官方文檔的Quick Start。

在應用反射機制之前,首先我們先來看一下如何獲取一個對象對應的反射類Class,在Java中我們有三種方法可以獲取一個對象的反射類。

通過getClass方法

在Java中,每一個Object都有一個getClass()方法,通過getClass方法我們可以獲取到這個對象對應的反射類:

  1. String s = "http://www.ziwenxie.site"
  2.  
  3. Class<?> c = s.getClass();  

通過forName方法

我們也可以調用Class類的靜態方法forName():

  1. Class<?> c = Class.forName("java.lang.String"); 

使用.class

或者我們也可以直接使用.class:

  1. Class<?> c = String.class; 

獲取類型信息

在文章開頭我們就提到反射的一大好處就是可以允許我們在運行期間獲取對象的類型信息,下面我們通過一個例子來具體看一下。

首先我們在typeinfo.interfacea包下面新建一個接口A:

  1. package typeinfo.interfacea; 
  2.  
  3. public interface A { void f(); }  

接著我們在typeinfo.packageaccess包下面新建一個類C,類C實現了接口A,并且我們還另外創建了幾個用于測試的方法,注意下面幾個方法的權限都是不同的。

  1. package typeinfo.packageaccess; 
  2.  
  3. import typeinfo.interfacea.A; 
  4.  
  5. class C implements A { 
  6.     public void f() { System.out.println("public C.f()"); } 
  7.     public void g() { System.out.println("public C.g()"); } 
  8.     protected void v () { System.out.println("protected C.v()"); } 
  9.     void u() { System.out.println("package C.u()"); } 
  10.     private void w() { System.out.println("private C.w()"); } 
  11.  
  12.  
  13. public class HiddenC { 
  14.     public static A makeA() { return new C(); } 
  15.  

在callHiddenMethod()方法中我們用到了幾個新的API,其中getDeclaredMethod()根據方法名用于獲取Class類指代對象自己聲明的某個方法,然后我們通過調用invoke()方法就可以觸發對象的相關方法:

  1. package typeinfo; 
  2.  
  3. import typeinfo.interfacea.A; 
  4. import typeinfo.packageaccess.HiddenC; 
  5.  
  6. import java.lang.reflect.Method; 
  7.  
  8. public class HiddenImplementation { 
  9.     public static void main(String[] args) throws Exception { 
  10.         A a = HiddenC.makeA(); 
  11.         a.f(); 
  12.         System.out.println(a.getClass().getName()); 
  13.         // Oops! Reflection still allows us to call g(): 
  14.         callHiddenMethod(a, "g"); 
  15.         // And even methods that are less accessible! 
  16.         callHiddenMethod(a, "u"); 
  17.         callHiddenMethod(a, "v"); 
  18.         callHiddenMethod(a, "w"); 
  19.     } 
  20.  
  21.     static void callHiddenMethod(Object a, String methodName) throws Exception { 
  22.         Method g = a.getClass().getDeclaredMethod(methodName); 
  23.         g.setAccessible(true); 
  24.         g.invoke(a); 
  25.     } 
  26.  

從輸出結果我們可以看出來,不管是public,default,protect還是private方法,通過反射類我們都可以自由調用。當然這里我們只是為了顯示反射的強大威力,在實際開發中這種技巧還是不提倡。

  1. public C.f() 
  2. typeinfo.packageaccess.C 
  3. public C.g() 
  4. package C.u() 
  5. protected C.v() 
  6. private C.w()  

上面我們只是測試了Method對象,感興趣的讀者在熟悉了反射的API之后,不妨測試一下Filed,這里我們就不重復了。

利用動態代理實現面向切面編程

AOP是Spring提供的一個強大特性之一,AOP的意思是面向切面編程,就是說要分離和業務不相關的代碼,當我們需要新增相關的事務的時候,我們不想對業務本身做修改。面向切面編程和面向對象變成相比到底有什么好處呢,我們通過一個例子來看一下,對于新手來說,常常會寫出下面這樣的代碼:

  1. public class Example1 { 
  2.     public void execute() { 
  3.         // 記錄日志 
  4.         Logger logger = Logger.getLog(...); 
  5.         // 進行性能統計 
  6.         PerformanceUtil.startTimer(...); 
  7.         // 權限檢查 
  8.         if (!user.hasPrevilege()) { 
  9.             // 拋出異常 
  10.         } 
  11.         // 執行真正的業務 
  12.         executeTransaction(); 
  13.         PerformanceUtil.endTimer(); 
  14.     } 
  15.  

雖然我們上面真正要執行的業務只有executeTransaction(),但是日志,性能,權限相關的代碼差不多要將真正的業務代碼掩蓋了。而且以后如果我們還有一個Example2,它同樣需要實現相同的日志,性能,權限代碼。這樣當以后我們需要新增相關的邏輯檢查的時候,我們需要所有Example進行重構,這顯然不符合面向對象的一個基本原則-封裝變化。

上面這個場景利用模板方法和裝飾器模式都可以解決,在Spring中是通過動態代理來實現的,下面我們通過一個例子來模擬一下Spring中的AOP實現。

我們要實現的業務是,統計員工工資的時候程序所執行的時間以及檢查用戶的權限。首先我們先來實現Salary類,它里面包含一些實現統計員工工資的業務邏輯:

  1. public interface SalaryInterface { 
  2.     public void doSalary(); 
  3.  
  4. public class Salary implements SalaryInterface { 
  5.     public void doSalary() { 
  6.         ... 
  7.     } 
  8.  

通過InvocationHandler我們來實現動態代理,以后當我們調用obj的相關方法之前,都會通過invoke方法進行代理,而不會直接調用obj方法。

  1. public class SimpleProxy implements InvocationHandler { 
  2.     private Object obj; 
  3.     private Object advice; 
  4.  
  5.     // 綁定代理對象 
  6.     public Object bind(Object obj, Advice advice) { 
  7.         this.obj = obj; 
  8.         this.advice = advice; 
  9.         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), 
  10.             obj.getClass().getInterfaces(), this) 
  11.     } 
  12.  
  13.     // 實現代理 
  14.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwalbe { 
  15.         Object result = null
  16.         try { 
  17.             advice.before(); 
  18.             result = method.invoke(obj, args); 
  19.             advice.after(); 
  20.         } catch(Exception e) { 
  21.             e.printStackTrace(); 
  22.         } 
  23.         return result 
  24.     } 
  25.  

模擬Spring中的Advice接口:

  1. public interface Advice { 
  2.     public void before(); 
  3.     public void after(); 
  4.  

實現TimeAdvice用于統計程序的執行時間:

  1. public class TimeAdvice implements Advice { 
  2.     long startTime; 
  3.     long endTime; 
  4.  
  5.     @Override 
  6.     public void before() { 
  7.         startTime = System.nanoTime(); // 獲取開始時間 
  8.     } 
  9.  
  10.     @Override 
  11.     public void after() { 
  12.         endTime = System.nanoTime(); // 獲取結束時間 
  13.     } 
  14.  

客戶端調用代碼如下:

  1. public class Client { 
  2.     public static void main(String[] args) { 
  3.         SimpleProxy = new SimpleProxy(); 
  4.         SalaryInterface salaryInterface = 
  5.             (SalaryInterface) simpleProxy.bind(new Salary(), new TimeAdvice()); 
  6.         salaryInterface.doSalary(); 
  7.     } 
  8.  

如果我們現在需要新增權限控制,我們來實現ControlAdvie類:

  1. public class ControlAdvice implements Advice { 
  2.     @Override 
  3.     public void before() { 
  4.         if (...) { 
  5.             ... 
  6.         } else { 
  7.             ... 
  8.         } 
  9.     } 
  10.  
  11.     @Override 
  12.     public void after() { 
  13.         ... 
  14.     } 
  15.  

而我們客戶端的代碼只需要改成simpleProxy.bind(new Salary(), new ControlAdvie)就行了,而SimpleProxy本身不需要做任何的修改。

與注解相結合

在單元測試框架比如Junit中反射機制也得到了廣泛的應用,即通過注解的方式。下面我們簡單地來了解一下如何通過反射機制來獲取相關方法的注解信息,比如說我們有下面這樣一個業務場景,當用戶在修改自己密碼的時候,為了保證密碼的安全性,我們要求用戶的新密碼要滿足一些條件,比如說至少要包含一個非數字字符,不能與以前的密碼相同之類的條件等。

  1. import java.lang.annotation.* 
  2.  
  3. @Target(ElementType.METHOD) 
  4. @Retention(RetentionPolicy.RUNTIME) 
  5. public @interface UserCase { 
  6.     public int id(); 
  7.     public String description() default "no description"
  8.  

下面是我們檢測密碼的工具類的實現:

  1. public class PasswordUtils { 
  2.     @UserCase(id=47, description="Password must contain at least one numeric"
  3.     public boolean validatePassword(String password) { 
  4.         return (password.matches("\\w*\\d\\w*")); 
  5.     } 
  6.  
  7.     @UserCase(id=48) 
  8.     public String encryptPassword(String password) { 
  9.         return new StringBuilder(password).reverse().toString(); 
  10.     } 
  11.  
  12.     @UserCase(id=49, description="New passwords can't equal previously used ones"
  13.     public boolean checkForNewPassword(List<String> prevPasswords, String password) { 
  14.         return !prevPasswords.contains(password); 
  15.     } 
  16.  

利用反射我們可以寫出更加清晰的測試代碼,其中getDeclaredMethods()方法可以獲取相關對象自己聲明的相關方法,而getAnnotation()則可以獲取Method對象的指定注解。

  1. public class UseCaseTracker { 
  2.     public static void trackUseCases(List<Integer> useCases, Class<?> cl) { 
  3.         for(Method m : cl.getDeclaredMethods()) { 
  4.             UseCase uc = m.getAnnotation(UseCase.class); 
  5.             if(uc != null) { 
  6.                 System.out.println("Found Use Case: " + uc.id() + " " + uc.description()); 
  7.                 useCases.remove(new Integer(uc.id())); 
  8.             } 
  9.         } 
  10.  
  11.         for(int i : useCases) { 
  12.             System.out.println("Warning: Missing use case-" + i); 
  13.         } 
  14.     } 
  15.  
  16.     public static void main(String[] args) { 
  17.         List<Integer> useCases = new ArrayList<Integer>(); 
  18.         Collections.addAll(useCases, 47, 48, 49, 50); 
  19.         trackUseCases(userCases, PasswordUtils.class); 
  20.     } 
  21.  

解決泛型擦除

現在有下面這樣一個業務場景,我們有一個泛型集合類List<Class<? extends Pet>>,我們需要統計出這個集合類中每種具體的Pet有多少個。由于Java的泛型擦除,注意類似List<? extends Pet>的做法肯定是不行的,因為編譯器做了靜態類型檢查之后,到了運行期間JVM會將集合中的對象都視為Pet,但是并不會知道Pet代表的究竟是Cat還是Dog,所以到了運行期間對象的類型信息其實全部丟失了。p.s: 關于泛型擦除,我在上一篇文章里面有詳細解釋,感興趣的朋友可以看一看。

為了實現我們上面的例子,我們先來定義幾個類:

  1. public class Pet extends Individual { 
  2.     public Pet(String name) { super(name); } 
  3.     public Pet() { super(); } 
  4.  
  5. public class Cat extends Pet { 
  6.     public Cat(String name) { super(name); } 
  7.     public Cat() { super(); } 
  8.  
  9. public class Dog extends Pet { 
  10.     public Dog(String name) { super(name); } 
  11.     public Dog() { super(); } 
  12.  
  13. public class EgyptianMau extends Cat { 
  14.     public EgyptianMau(String name) { super(name); } 
  15.     public EgyptianMau() { super(); } 
  16.  
  17. public class Mutt extends Dog { 
  18.     public Mutt(String name) { super(name); } 
  19.     public Mutt() { super(); } 
  20.  

上面的Pet類繼承自Individual,Individual類的的實現稍微復雜一點,我們實現了Comparable接口,重新自定義了類的比較規則,如果不是很明白的話,也沒有關系,我們已經將它抽象出來了,所以不理解實現原理也沒有關系。

  1. public class Individual implements Comparable<Individual> { 
  2.     private static long counter = 0; 
  3.     private final long id = counter++; 
  4.     private String name; // name is optional 
  5.  
  6.     public Individual(String name) { this.name = name; } 
  7.  
  8.     public Individual() {} 
  9.  
  10.     public String toString() { 
  11.         return getClass().getSimpleName() + (name == null ? "" : " " + name); 
  12.     } 
  13.  
  14.     public long id() { return id; } 
  15.  
  16.     public boolean equals(Object o) { 
  17.         return o instanceof Individual && id == ((Individual)o).id; 
  18.     } 
  19.  
  20.     public int hashCode() { 
  21.         int result = 17; 
  22.         if (name != null) { 
  23.             result = 37 * result + name.hashCode(); 
  24.         } 
  25.         result = 37 * result + (int) id; 
  26.         return result; 
  27.     } 
  28.  
  29.     public int compareTo(Individual arg) { 
  30.         // Compare by class name first
  31.         String first = getClass().getSimpleName(); 
  32.         String argFirst = arg.getClass().getSimpleName(); 
  33.         int firstCompare = first.compareTo(argFirst); 
  34.         if (firstCompare != 0) { 
  35.             return firstCompare; 
  36.         } 
  37.  
  38.         if (name != null && arg.name != null) { 
  39.             int secendCompare = name.compareTo(arg.name); 
  40.             if (secendCompare != 0) { 
  41.                 return secendCompare; 
  42.             } 
  43.         } 
  44.  
  45.         return (arg.id < id ? -1 : (arg.id == id ? 0 : 1)); 
  46.     } 
  47.  

下面創建了一個抽象類PetCreator,以后我們通過調用arrayList()方法便可以直接獲取相關Pet類的集合。這里使用到了我們上面沒有提及的newInstance()方法,它會返回Class類所真正指代的類的實例,這是什么意思呢?比如說聲明new Dog().getClass().newInstance()和直接new Dog()是等價的。

  1. public abstract class PetCreator { 
  2.     private Random rand = new Random(47); 
  3.  
  4.     // The List of the different getTypes of Pet to create
  5.     public abstract List<Class<? extends Pet>> getTypes(); 
  6.  
  7.     public Pet randomPet() { 
  8.         // Create one random Pet 
  9.         int n = rand.nextInt(getTypes().size()); 
  10.  
  11.         try { 
  12.             return getTypes().get(n).newInstance(); 
  13.         } catch (InstantiationException e) { 
  14.             throw new RuntimeException(e); 
  15.         } catch (IllegalAccessException e) { 
  16.             throw new RuntimeException(e); 
  17.         } 
  18.     } 
  19.  
  20.     public Pet[] createArray(int size) { 
  21.         Pet[] result = new Pet[size]; 
  22.  
  23.         for (int i = 0; i < size; i++) { 
  24.            result[i] = randomPet(); 
  25.         } 
  26.         return result; 
  27.     } 
  28.  
  29.     public ArrayList<Pet> arrayList(int size) { 
  30.         ArrayList<Pet> result = new ArrayList<Pet>(); 
  31.         Collections.addAll(result, createArray(size)); 
  32.         return result; 
  33.     } 
  34.  

接下來我們來實現上面這一個抽象類,解釋一下下面的代碼,在下面的代碼中,我們聲明了兩個集合類,allTypes和types,其中allTypes中包含了我們呢上面所聲明的所有類,但是我們具體的類型實際上只有兩種即Mutt和EgypianMau,所以我們真正需要new出來的寵物只是types中所包含的類型,以后我們通過調用getTypes()便可以得到types中所包含的所有類型。

  1. public class LiteralPetCreator extends PetCreator { 
  2.     @SuppressWarnings("unchecked"
  3.     public static final List<Class<? extends Pet>> allTypes = Collections.unmodifiableList( 
  4.         Arrays.asList(Pet.class, Dog.class, Cat.class, Mutt.class, EgyptianMau.class)); 
  5.  
  6.     private static final List<Class<? extends Pet>> types = allTypes.subList( 
  7.         allTypes.indexOf(Mutt.class), allTypes.size()); 
  8.  
  9.     public List<Class<? extends Pet>> getTypes() { 
  10.         return types; 
  11.     } 
  12.  

總體的邏輯已經完成了,***我們實現用來統計集合中相關Pet類個數的TypeCounter類。解釋一下isAssignalbeFrom()方法,它可以判斷一個反射類是某個反射類的子類或者間接子類。而getSuperclass()顧名思義就是得到某個反射類的父類了。

  1. public class TypeCounter extends HashMap<Class<?>, Integer> { 
  2.     private Class<?> baseType; 
  3.  
  4.     public TypeCounter(Class<?> baseType) { 
  5.         this.baseType = baseType; 
  6.     } 
  7.  
  8.     public void count(Object obj) { 
  9.         Class<?> type = obj.getClass(); 
  10.         if (!baseType.isAssignableFrom(type)) { 
  11.             throw new RuntimeException( 
  12.                 obj + " incorrect type " + type + ", should be type or subtype of " + baseType); 
  13.         } 
  14.         countClass(type); 
  15.     } 
  16.  
  17.     private void countClass(Class<?> type) { 
  18.         Integer quantity = get(type); 
  19.         put(type, quantity == null ? 1 : quantity + 1); 
  20.         Class<?> superClass = type.getSuperclass(); 
  21.         if (superClass != null && baseType.isAssignableFrom(superClass)) { 
  22.             countClass(superClass); 
  23.         } 
  24.     } 
  25.  
  26.     @Override 
  27.     public String toString() { 
  28.         StringBuilder result = new StringBuilder("{"); 
  29.  
  30.         for (Map.Entry<Class<?>, Integer> pair : entrySet()) { 
  31.             result.append(pair.getKey().getSimpleName()); 
  32.             result.append("="); 
  33.             result.append(pair.getValue()); 
  34.             result.append(", "); 
  35.         } 
  36.  
  37.         result.delete(result.length() - 2, result.length()); 
  38.         result.append("} "); 
  39.         return result.toString(); 
  40.     } 
  41.  

測試代碼如下:

  1. public static void main(String[] args) { 
  2.     TypeCounter counter = new TypeCounter(Pet.class); 
  3.     for (Pet pet : Pets.createArray(20)) { 
  4.         System.out.println(pet.getClass().getSimpleName() + " "); 
  5.         counter.count(pet); 
  6.     } 
  7.     System.out.println(counter); 
  8.  

References

THINKING IN JAVA 

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

2017-03-24 09:44:33

Java反射機制

2012-04-05 13:50:38

Java

2015-09-23 09:08:38

java反射

2010-04-01 09:22:38

代理模式Java反射機制

2011-09-27 10:23:24

Java反射機制

2011-03-09 09:11:52

java反射機制

2011-04-01 14:50:56

Java的反射機制

2009-06-17 13:57:54

java實例Reflection

2022-10-21 14:12:06

2012-02-08 09:44:52

Java反射

2010-09-17 13:02:11

JAVA反射機制

2010-09-17 12:39:51

JAVA反射機制

2010-08-11 09:40:44

LINQ

2011-05-26 15:23:34

JavaReflection

2012-02-08 10:12:19

Java反射

2023-11-01 13:48:00

反射java

2012-02-08 09:53:25

Java反射

2025-10-11 04:11:00

2009-06-19 13:59:41

Java反射機制

2021-07-14 08:31:08

Java反射機制Class類
點贊
收藏

51CTO技術棧公眾號

伊人影院蕉久影院在线播放| 亚洲天堂手机版| 免费观看不卡av| 7777精品久久久大香线蕉| 一区二区三区视频在线播放| 亚洲av无码片一区二区三区| 午夜在线视频观看日韩17c| 中文字幕日韩av| 岛国av免费观看| 91精品影视| 亚洲图片欧美色图| 亚洲精品国产精品久久| 黄频在线免费观看| 理论电影国产精品| 91精品国产一区| 久久国产高清视频| 外国成人在线视频| 日韩你懂的电影在线观看| 免费成人在线视频网站| www.欧美日本韩国| 国产欧美日韩视频在线观看| 99久久无色码| 一级片在线观看视频| 亚洲激情视频| 色综合91久久精品中文字幕| 久久国产柳州莫菁门| 国产精品调教视频| 91精品国产综合久久久久久久| 国产婷婷一区二区三区| 超碰caoporn久久| 欧美激情中文不卡| 明星裸体视频一区二区| 丰满人妻妇伦又伦精品国产| 久久99精品视频| 国产成人一区三区| 亚洲午夜18毛片在线看| 欧美色图首页| 欧美日韩成人免费| 草视频在线观看| 天天揉久久久久亚洲精品| 亚洲最新中文字幕| 扒开jk护士狂揉免费| 国产福利资源一区| 精品久久久久久综合日本欧美| 日韩在线一区视频| 亚洲精品777| 欧美日本高清视频在线观看| 久久久久国产精品熟女影院| 午夜裸体女人视频网站在线观看| 亚洲成人你懂的| 丰满少妇大力进入| 波多野结衣在线播放| 一区二区三区高清| www.一区二区.com| 黑人极品ⅴideos精品欧美棵| 亚洲免费资源在线播放| 天天在线免费视频| 性xxxfreexxxx性欧美| 亚洲精品久久久久久国产精华液| 日本三日本三级少妇三级66| huan性巨大欧美| 亚洲一区二区三区在线播放| 国产精品久久久久久久久电影网| 任你弄在线视频免费观看| 一区二区三区高清不卡| 日本xxxxxxxxxx75| 亚洲深夜视频| 欧美专区日韩专区| av中文字幕网址| 2023国产精华国产精品| 亚洲国产第一页| 李宗瑞91在线正在播放| 激情婷婷综合| 久久久精品在线观看| 一区二区在线观看免费视频| 国内精品亚洲| 欧美最猛黑人xxxx黑人猛叫黄| 97人妻一区二区精品视频| 蜜臀av一级做a爰片久久| 91精品综合视频| 亚洲男女视频在线观看| 97久久精品人人做人人爽50路| 欧美日韩喷水| 老司机福利在线视频| 亚洲六月丁香色婷婷综合久久| 国产精品久久国产| 欧美日韩精品免费观看视完整| 欧美裸体一区二区三区| 特级特黄刘亦菲aaa级| 亚洲日本三级| 美女少妇精品视频| 欧美h在线观看| 免费成人av资源网| 国产视频一区二区三区四区| 男人天堂综合| 伊人婷婷欧美激情| 久久久精品在线视频| 欧美日韩免费电影| 亚洲精品国产电影| 精品人妻伦九区久久aaa片| 亚洲免费激情| 亚洲一区中文字幕在线观看| 亚洲色图狠狠干| 日韩理论片一区二区| 日韩国产欧美亚洲| 国产午夜精品一区在线观看| 精品视频在线播放免| 亚洲熟女毛茸茸| 久久高清免费观看| 国产乱码精品一区二区三区不卡| 国产爆初菊在线观看免费视频网站 | 亚洲影院在线看| 男人的天堂av高清在线| 亚洲综合丁香婷婷六月香| 激情内射人妻1区2区3区| 成人在线视频中文字幕| 色偷偷偷亚洲综合网另类| 日韩手机在线观看| 国产精品一品视频| 在线视频欧美一区| 久久野战av| 亚洲黄色av女优在线观看| 成人欧美一区二区三区黑人一| 在线视频免费在线观看一区二区| 91在线免费网站| av电影在线网| 91久久久免费一区二区| 日本少妇xxxx| 亚洲一级特黄| 99影视tv| 在线电影福利片| 69久久夜色精品国产69蝌蚪网| 波多野吉衣中文字幕| 妖精视频成人观看www| 不卡日韩av| 在线三级中文| 欧美一区二区成人6969| 男人天堂资源网| 免费在线看一区| 亚洲 国产 欧美一区| 偷拍视频一区二区三区| 亚洲毛片在线观看| 欧美精品一二三四区| 99re66热这里只有精品3直播| 国产曰肥老太婆无遮挡| 岛国av一区| 欧美极品第一页| 性一交一乱一精一晶| 亚洲欧美日韩精品久久久久| www激情五月| 欧美99久久| 国产高清精品一区| 91九色国产在线播放| 亚洲国产精彩中文乱码av| 黄色小视频在线免费看| 成人高清伦理免费影院在线观看| 免费人成自慰网站| 国产精品国产| 欧洲亚洲在线视频| 国产视频网站在线| 欧美日韩国产高清一区二区三区| 亚洲欧洲综合网| 国模娜娜一区二区三区| 精品无码av无码免费专区| 超碰精品在线观看| 欧美亚洲国产日韩2020| 国产私拍精品| 91精品国产综合久久久久| 久久一级黄色片| 91美女片黄在线观看| 国产v亚洲v天堂无码久久久| 欧美好骚综合网| 97在线资源站| gay欧美网站| 色狠狠久久aa北条麻妃 | 日韩精品www| 波多野结衣mp4| 亚洲视频香蕉人妖| 在线视频 日韩| 蜜桃精品在线观看| 国产爆乳无码一区二区麻豆 | 国产成人久久精品77777最新版本| 国产性生活免费视频| 亚洲三级网址| 91丨九色丨国产在线| 99re6在线精品视频免费播放| 亚洲人成电影网站色| 国产免费不卡av| 香蕉成人伊视频在线观看| 精品无码在线观看| 成人综合在线网站| 五月婷婷激情久久| 亚洲午夜久久久久久尤物| 欧美日韩一区二区三区免费| 99视频这里有精品| 欧美在线一级视频| 久cao在线| 国产午夜精品久久久 | 亚洲一区精彩视频| 欧美大胆a级| 91精品免费久久久久久久久| www在线观看黄色| 最近中文字幕日韩精品| 后进极品白嫩翘臀在线视频| 欧美高清视频一二三区 | 午夜成年人在线免费视频| 国产丝袜一区二区| 黄色福利在线观看| 8x福利精品第一导航| 亚洲精品午夜国产va久久成人| 亚洲视频 欧洲视频| 永久免费成人代码| 99视频一区二区| 日本高清免费观看| 青草av.久久免费一区| 黄色国产一级视频| 欧美三级免费| 日本三级中文字幕在线观看| 国产永久精品大片wwwapp| 国产一区二区三区色淫影院| 成人激情久久| 成人a视频在线观看| 丝袜美腿一区| 国产成人久久久精品一区| 成人高潮aa毛片免费| 大胆欧美人体视频| 搞黄网站在线观看| 久久精品久久久久电影| av网站在线免费观看| 亚洲人成五月天| 日本ー区在线视频| 亚洲欧美制服第一页| 婷婷av一区二区三区| 亚洲第一区第一页| 亚洲男女视频在线观看| 日韩视频免费观看高清在线视频| 91欧美日韩麻豆精品| 欧美日韩五月天| 中文字幕理论片| 欧美亚洲禁片免费| 成人免费一级片| 欧美网站一区二区| 在线免费一区二区| 欧美亚洲国产一区在线观看网站| 中文人妻av久久人妻18| 色网站国产精品| 伊人久久中文字幕| 欧美天堂一区二区三区| 成人黄色三级视频| 欧美日韩在线一区二区| 老熟妇一区二区三区啪啪| 欧洲一区二区三区在线| 国产精品无码一区| 欧美日本在线观看| 91麻豆成人精品国产| 欧美久久久久久久久久| 国产黄色片网站| 精品久久久网站| 色视频免费在线观看| 亚洲精品一区久久久久久| 国产视频网址在线| 日韩中文有码在线视频| 九色porny丨首页在线| 欧美日韩第一视频| 天堂网在线最新版www中文网| 欧美有码在线观看| 久久69成人| 国产精品久久精品国产| 欧美深夜视频| 亚洲激情电影在线| 五月开心六月丁香综合色啪| 成人黄色片免费| 亚洲美女少妇无套啪啪呻吟| 欧美日韩亚洲第一| 精品一区二区三区在线播放 | 神马日本精品| 天堂社区 天堂综合网 天堂资源最新版| 欧美三级情趣内衣| 欧美 国产 精品| 国产日韩欧美一区在线| 久久久国产欧美| 国产黄色91视频| v8888av| 综合av第一页| 国产手机在线视频| 欧美日本高清视频在线观看| 国产 欧美 精品| 国产一区二区av| 欧美aaaaaaa| 国产精品成人国产乱一区 | hd国产人妖ts另类视频| 国产精品999999| 一区三区自拍| 视频一区视频二区视频三区高| 你懂的国产精品| 一区二区三区韩国| 成人毛片在线观看| 你懂得视频在线观看| 亚洲成人av福利| 一级片aaaa| 亚洲人成网站777色婷婷| 影音先锋男人资源在线| 国产国语videosex另类| 亚洲一区网址| 亚洲一二区在线| 亚洲一区激情| 蜜桃视频无码区在线观看| 国产色一区二区| 可以在线观看av的网站| 制服丝袜成人动漫| 国产理论电影在线观看| 国内精品久久久久久久久| 亚洲欧美在线人成swag| 久久综合婷婷综合| 亚洲午夜一区| 日韩精品xxx| 国产精品入口麻豆九色| 国产精品久久久久久久妇| 日韩精品一区二区三区视频播放| av网站在线免费观看| 国产v综合v亚洲欧美久久| 啪啪激情综合网| 成品人视频ww入口| 国产精品一品二品| 黄色香蕉视频在线观看| 欧美在线|欧美| 美州a亚洲一视本频v色道| 91高清视频在线免费观看| 一级毛片精品毛片| 日韩人妻一区二区三区蜜桃视频| 蜜臀久久久久久久| www.日本高清视频| 欧美亚洲丝袜传媒另类| 国内在线精品| 国产精品久久久久久一区二区 | 最新中文字幕亚洲| 91欧美精品| 亚洲精品国产精品国自产| 日韩精品1区2区3区| 免费一级做a爰片久久毛片潮| 亚洲一区二区黄色| 丁香六月色婷婷| 高清欧美性猛交| 蜜臀av一区| 免费看又黄又无码的网站| www.视频一区| 欧美一级特黄视频| 亚洲男人天堂古典| 日本高清不卡一区二区三区视频| 蜜桃传媒一区二区| 丝瓜av网站精品一区二区| 亚洲黄色小说视频| 欧美日韩精品一区二区三区四区| 尤物视频在线免费观看| 国产在线视频一区| 亚洲国产日韩欧美在线| 色欲无码人妻久久精品| 亚洲第一狼人社区| 天天射天天色天天干| 欧洲亚洲在线视频| 欧美丰满日韩| 交换做爰国语对白| 亚洲图片一区二区| 九九九伊在人线综合| 国产精品亚洲网站| 欧美久久一区| 极品白嫩丰满美女无套| 色婷婷综合久久久中文字幕| 久久精品a一级国产免视看成人| 国产精品免费网站| 一本一道久久a久久精品蜜桃| 男人的天堂免费| 一道本成人在线| 日本在线观看免费| 国产精品污www一区二区三区| 夜夜嗨一区二区三区| 免费看91的网站| 日韩免费成人网| 正在播放日韩精品| 一本久道久久综合| 成人午夜av电影| 日韩在线视频不卡| 久热在线中文字幕色999舞| 久久影院资源站| 欧美成年人视频在线观看| 亚洲综合免费观看高清完整版 | 911美女片黄在线观看游戏| 美女视频黄免费的亚洲男人天堂| 亚洲欧美tv| 人妻精品久久久久中文字幕69| 色综合天天天天做夜夜夜夜做| gogogogo高清视频在线| 欧美日韩视频在线一区二区观看视频| 国产一区中文字幕| 青青青国产在线| 免费97视频在线精品国自产拍| 亚洲精品推荐| 亚洲精品鲁一鲁一区二区三区| 色婷婷综合久久久久中文一区二区 | 91po在线观看91精品国产性色|