日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015

發布時間:2025/4/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?原文地址:http://hannesdorfmann.com/annotation-processing/annotationprocessing101

In?this blog entry I would like to explain how to write an annotation processor. So here is my tutorial. First, I am going to explain to you what annotation processing is, what you can do with that powerful tool and finally what you cannot do with it. In a second step we will implement a simple annotation processor step by step.

The Basics

To clarify a very important thing from the very beginning: we are not talking about evaluating annotations by using reflections at runtime (run time = the time when the application runs). Annotation processing takes place at compile time (compile time = the time when the java compiler compiles your java source code).

Annotation processing is a tool build in javac for scanning and processing annotations?at compile time. You can register your own annotation processor for certain annotations. At this point I assume that you already know what an annotation is and how to declare an annotation type. If you are not familar with annotations you can find more information in theofficial java documentation. Annotation processing is already available since Java 5 but a useable API is available since Java 6 (released in December 2006). It took some time until the java world realized the power of annotation processing. So it has become popular in the last few years.

An annotation processor for a certain annotation takes java code (or compiled byte code) as input and generate files (usually .java files) as output. What does that exactly means? You can generate java code! The generated java code is in a generated?.java?file. So you?can notmanipulate an existing java class for instance adding a method. The generated java file will be compiled by javac as any other hand written java source file.

AbstractProcessor

Let’s have a look at the Processor API. Every Processor extends from?AbstractProcessor?as follows:

package com.example; public class MyProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment env){ } @Override public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { } @Override public Set<String> getSupportedAnnotationTypes() { } @Override public SourceVersion getSupportedSourceVersion() { } }
  • init(ProcessingEnvironment env): Every annotation processor class?must have an empty constructor. However, there is a special init() method which is invoked by the annotation processing tool with the?ProcessingEnviroment?as parameter. The ProcessingEnviroment provides some useful util classes?Elements,?Types?and?Filer. We will use them later.
  • process(Set<? extends TypeElement> annotations, RoundEnvironment env): This is kind of?main()?method of each processor. Here you write your code for scanning, evaluating and processing annotations and generating java files. With?RoundEnviroment?passed as parameter you can query for elements annotated with a certain annotation as we will see later.
  • getSupportedAnnotationTypes(): Here you have to specify for which annotations this annotation processor should be registered for. Note that the return type is a set of strings containing full qualified names for your annotation types you want to process with this annotation processor. In other words, you define here for which annotations you register your annotation processor.
  • getSupportedSourceVersion(): Used to specify which java version you use. Usually you will return?SourceVersion.latestSupported(). However, you could also return?SourceVersion.RELEASE_6?if you have good reasons for stick with Java 6. I recommend to useSourceVersion.latestSupported();

With Java 7 you could also use annotations instead of overriding?getSupportedAnnotationTypes()and?getSupportedSourceVersion()?like that:

@SupportedSourceVersion(SourceVersion.latestSupported()) @SupportedAnnotationTypes({ // Set of full qullified annotation type names }) public class MyProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment env){ } @Override public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { } }

For compatibility reasons, especially for android, I recommend to overridegetSupportedAnnotationTypes()?and?getSupportedSourceVersion()?instead of using@SupportedAnnotationTypes?and?@SupportedSourceVersion

The next thing you have to know is that the annotation processor runs in it’s own jvm. Yes you read correctly. javac starts a complete java virtual machine for running annotation processors. So what that means for you? You can use anything you would use in any other java application. Use guava! If you want to you can use dependency injection tools like dagger or any other library you want to. But don’t forget. Even if it’s just a small processor you should take care about efficient algorithms and design patterns like you would do for any other java application.

Register Your Processor

You may ask yourself?“How do I register MyProcessor to javac?”. You have to provide a?.jarfile. Like any other .jar file you pack your (compiled) annotation processor in that file. Furthermore you also have to pack a special file called?javax.annotation.processing.Processorlocated in?META-INF/services?in your .jar file. So the content of your .jar file looks like this:

MyProcessor.jar- com - example - MyProcessor.class - META-INF - services - javax.annotation.processing.Processor

The content of the file?javax.annotation.processing.Processor?(packed in MyProcessor.jar) is a list with full qualified class names to the processors with new line as delimiter:

com.example.MyProcessor com.foo.OtherProcessor net.blabla.SpecialProcessor

With?MyProcessor.jar?in your buildpath javac automatically detects and reads thejavax.annotation.processing.Processor?file and registers?MyProcessor?as annotation processor.

Example: Factory Pattern

It’s time to for a concrete example. We will use maven as our build system and dependency management tool. If you are not familiar with maven, don’t worry maven is not necessary. The whole code can be found?on github.

First of all I have to say, that it’s not so easy to find a simple problem for a tutorial that we can solve with an annotation processor. Here we gonna implement a very simple factory pattern (not abstract factory pattern). It should give you just a brief introduction on the annotation processing API. So the problem statement may be a little bit dump and not a real world one. Once again, you will learn about annotation processing and not about design patterns.

So here is the problem: We want to implement a pizza store. The pizza store offers to it’s customers 2 Pizzas (“Margherita” and “Calzone”) and Tiramisu for dessert.

Have a look at this code snippets, which should not need any further explanation:

public interface Meal {public float getPrice(); } public class MargheritaPizza implements Meal { @Override public float getPrice() { return 6.0f; } } public class CalzonePizza implements Meal { @Override public float getPrice() { return 8.5f; } } public class Tiramisu implements Meal { @Override public float getPrice() { return 4.5f; } }

To order in our?PizzaStore?the customer has to enter the name of the meal:

public class PizzaStore {public Meal order(String mealName) { if (mealName == null) { throw new IllegalArgumentException("Name of the meal is null!"); } if ("Margherita".equals(mealName)) { return new MargheritaPizza(); } if ("Calzone".equals(mealName)) { return new CalzonePizza(); } if ("Tiramisu".equals(mealName)) { return new Tiramisu(); } throw new IllegalArgumentException("Unknown meal '" + mealName + "'"); } public static void main(String[] args) throws IOException { PizzaStore pizzaStore = new PizzaStore(); Meal meal = pizzaStore.order(readConsole()); System.out.println("Bill: $" + meal.getPrice()); } }

As you see, we have a lot of?if statements?in the?order()?method and whenever we add a new type of pizza we have to add a new if statement. But wait, with annotation processing and the factory pattern we can let an annotation processor generate this?if statements. So what we want to have is something like that:

public class PizzaStore {private MealFactory factory = new MealFactory(); public Meal order(String mealName) { return factory.create(mealName); } public static void main(String[] args) throws IOException { PizzaStore pizzaStore = new PizzaStore(); Meal meal = pizzaStore.order(readConsole()); System.out.println("Bill: $" + meal.getPrice()); } }

The?MealFactory?should look as follows:

public class MealFactory {public Meal create(String id) { if (id == null) { throw new IllegalArgumentException("id is null!"); } if ("Calzone".equals(id)) { return new CalzonePizza(); } if ("Tiramisu".equals(id)) { return new Tiramisu(); } if ("Margherita".equals(id)) { return new MargheritaPizza(); } throw new IllegalArgumentException("Unknown id = " + id); } }

@Factory Annotation

Guess what: We want to generate the?MealFactory?by using annotation processing. To be more general, we want to provide an annotation and a processor for generating factory classes.

Let’s have a look at the?@Factory?annotation:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS) public @interface Factory { /** * The name of the factory */ Class type(); /** * The identifier for determining which item should be instantiated */ String id(); }

The idea is that we annotate classes which should belong to the same factory with the sametype()?and with?id()?we do the mapping from?"Calzone"?to?CalzonePizza?class. Let’s apply@Factory?to our classes:

@Factory(id = "Margherita", type = Meal.class ) public class MargheritaPizza implements Meal { @Override public float getPrice() { return 6f; } } @Factory(id = "Calzone", type = Meal.class ) public class CalzonePizza implements Meal { @Override public float getPrice() { return 8.5f; } } @Factory(id = "Tiramisu", type = Meal.class ) public class Tiramisu implements Meal { @Override public float getPrice() { return 4.5f; } }

You may ask yourself if we could just apply?@Factory?on the?Meal?interface. Annotations are not inherited. Annotating?class X?with an annotation does not mean that?class Y extends X?is automatically annotated. Before we start writing the processor code we have to specify some rules:

  • Only classes can be annotated with?@Factory?since interfaces or abstract classes can not be instantiated with the?new?operator.
  • Classes annotated with?@Factory?must provide at least one public empty default constructor (parameterless). Otherwise we could not instantiate a new instance.
  • Classes annotated with?@Factory?must inherit directly or indirectly from the specified?type(or implement it if it’s an interface).
  • @Factory?annotations with the same?type?are grouped together and one Factory class will be generated. The name of the generated class has?“Factory”?as suffix, for example?type = Meal.class?will generate?MealFactory
  • id?are limited to Strings and must be unique in it’s type group.
  • The Processor

    I will guide you step by step by adding line of code followed by an explanation paragraph. Three dots (...) means that code is omitted either was discussed in the paragraph before or will be added later as next step. Goal is to make the snipped more readable. As already mentioned above the complete code can be found?on github. Ok lets start with the skeleton of our?FactoryProcessor:

    @AutoService(Processor.class) public class FactoryProcessor extends AbstractProcessor { private Types typeUtils; private Elements elementUtils; private Filer filer; private Messager messager; private Map<String, FactoryGroupedClasses> factoryClasses = new LinkedHashMap<String, FactoryGroupedClasses>(); @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); typeUtils = processingEnv.getTypeUtils(); elementUtils = processingEnv.getElementUtils(); filer = processingEnv.getFiler(); messager = processingEnv.getMessager(); } @Override public Set<String> getSupportedAnnotationTypes() { Set<String> annotataions = new LinkedHashSet<String>(); annotataions.add(Factory.class.getCanonicalName()); return annotataions; } @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latestSupported(); } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { ... } }

    In the first line you see?@AutoService(Processor.class). What’s that? It’s an annotation from another annotation processor. This?AutoService?annotation processor has been developed by Google and generates the?META-INF/services/javax.annotation.processing.Processor?file. Yes, you read correctly. We can use annotation processors in our annotation processor. Handy, isn’t it? In?getSupportedAnnotationTypes()?we specify that?@Factory?is processed by this processor.

    Elements and TypeMirrors

    In?init()?we retrieve a reference to

    • Elements: A utils class to work with?Element?classes (more information later).
    • Types: A utils class to work with?TypeMirror?(more information later)
    • Filer: Like the name suggests with Filer you can create files.

    In annotation processing we are scanning java source code files. Every part of the source code is a certain type of?Element. In other words:?Element?represents a program element such as a package, class, or method. Each element represents a static, language-level construct. In the following example I have added comments to clarify that:

    package com.example; // PackageElement public class Foo { // TypeElement private int a; // VariableElement private Foo other; // VariableElement public Foo () {} // ExecuteableElement public void setA ( // ExecuteableElement int newA // TypeElement ) {} }

    You have to change the way you see source code. It’s just structured text. It’s not executable. You can think of it like a XML file you try to parse (or an abstract syntax tree in compiler construction). Like in XML parsers there is some kind of DOM with elements. You can navigate from Element to it’s parent or child Element.

    For instance if you have a?TypeElement?representing?public class Foo?you could iterate over its children like that:

    TypeElement fooClass = ... ; for (Element e : fooClass.getEnclosedElements()){ // iterate over children Element parent = e.getEnclosingElement(); // parent == fooClass }

    As you see Elements are representing source code. TypeElement represent type elements in the source code like classes. However, TypeElement does not contain information about the class itself. From TypeElement you will get the name of the class, but you will not get information about the class like the superclass. This is kind of information are accessible through a?TypeMirror. You can access the TypeMirror of an Element by calling?element.asType().

    Searching For @Factory

    So lets implement the?process()?method step by step. First we start with searching for classes annotated with?@Factory:

    @AutoService(Processor.class) public class FactoryProcessor extends AbstractProcessor { private Types typeUtils; private Elements elementUtils; private Filer filer; private Messager messager; private Map<String, FactoryGroupedClasses> factoryClasses = new LinkedHashMap<String, FactoryGroupedClasses>(); ... @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { // Itearate over all @Factory annotated elements for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Factory.class)) { ... } } ... }

    No rocket science here.?roundEnv.getElementsAnnotatedWith(Factory.class))?returnes a list of Elements annotated with?@Factory. You may have noted that I have avoited saying?“returns list of classes annotated with @Factory”, because it really returns list of?Element. Remember:Element?can be a class, method, variable etc. So what we have to do next is to check if the Element is a class:

    @Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Factory.class)) { // Check if a class has been annotated with @Factory if (annotatedElement.getKind() != ElementKind.CLASS) { ... } } ... }

    What’s going on here? We want to ensure that only elements of type class are processed by our processor. Previously we have learned that classes are?TypeElements. So why don’t we check?if (! (annotatedElement instanceof TypeElement) ). That’s a wrong assumption because interfaces are TypeElement as well. So in annoation processing you should avoid?instanceofbut rather us?ElementKind?or?TypeKind?with TypeMirror.

    Error Handling

    In?init()?we also retrieve a reference to?Messager. A Messager provides the way for an annotation processor to report error messages, warnings and other notices. It’s not a logger for you, the developer of the annotation processor (even thought it can be used for that during development of the processor). Messager is used to write messages to the third party developer who uses your annotation processor in their projects. There are different levels of messages described in the?official docs. Very important is?Kind.ERROR?because this kind of message is used to indicate that our annotation processor has failed processing. Probably the third party developer is misusing our?@Factory?annotation (i.e. annotated an interface with @Factory). The concept is a little bit different from traditional java application where you would throw an?Exception. If you throw an exception in?process()?then the jvm which runs annotation processing crashs (like any other java application) and the third party developer who is using our FactoryProcessor will get an error from javac with a hardly understandable Exception, because it contains the stacktrace of FactoryProcessor. Therefore Annotation Processor has this?Messager?class. It prints a pretty error message. Additionaly, you can link to the element who has raised this error. In modern IDEs like IntelliJ the third party developer can click on this error message and the IDE will jump to the source file and line of the third party developers project where the error source is.

    Back to implementing the?process()?method. We raise a error message if the user has annotated a non class with @Factory:

    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Factory.class)) { // Check if a class has been annotated with @Factory if (annotatedElement.getKind() != ElementKind.CLASS) { error(annotatedElement, "Only classes can be annotated with @%s", Factory.class.getSimpleName()); return true; // Exit processing } ... } private void error(Element e, String msg, Object... args) { messager.printMessage( Diagnostic.Kind.ERROR, String.format(msg, args), e); } }

    To get the message of the Messager displayed it’s?important that the annotation processor has to complete without crashing. That’s why we?return?after having callederror(). If we don’t return here?process()?will continue running since?messager.printMessage( Diagnostic.Kind.ERROR)?does not stop the process. So it’s very likely that if we don’t return after printing the error we will run in an internal?NullPointerException?etc. if we continue inprocess(). As said before, the problem is that if an unhandled exception is thrown in?process()javac will print the stacktrace of the internal?NullPointerException?and NOT your error message of?Messager.

    Datamodel

    Before we continue with checking if classes annotated with @Factory observe our five rules (see above) we are going to introduce data structures which makes it easier for us to continue. Sometimes the problem or processor seems to be so simple that programmers tend to write the whole processor in a procedural manner.?But you know what? An Annotation Processor is still a java application. So use object oriented programming, interfaces, design patterns and anything else you would use in any other java application!

    Our FactoryProcessor is quite simple but there are some information we want to store as objects. With?FactoryAnnotatedClass?we store the annotated class data like qualified class name along with the data of the @Factory annotation itself. So we store the TypeElement and evaluate the @Factory annotation:

    public class FactoryAnnotatedClass {private TypeElement annotatedClassElement; private String qualifiedSuperClassName; private String simpleTypeName; private String id; public FactoryAnnotatedClass(TypeElement classElement) throws IllegalArgumentException { this.annotatedClassElement = classElement; Factory annotation = classElement.getAnnotation(Factory.class); id = annotation.id(); if (StringUtils.isEmpty(id)) { throw new IllegalArgumentException( String.format("id() in @%s for class %s is null or empty! that's not allowed", Factory.class.getSimpleName(), classElement.getQualifiedName().toString())); } // Get the full QualifiedTypeName try { Class<?> clazz = annotation.type(); qualifiedSuperClassName = clazz.getCanonicalName(); simpleTypeName = clazz.getSimpleName(); } catch (MirroredTypeException mte) { DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror(); TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement(); qualifiedSuperClassName = classTypeElement.getQualifiedName().toString(); simpleTypeName = classTypeElement.getSimpleName().toString(); } } /** * Get the id as specified in {@link Factory#id()}. * return the id */ public String getId() { return id; } /** * Get the full qualified name of the type specified in {@link Factory#type()}. * * @return qualified name */ public String getQualifiedFactoryGroupName() { return qualifiedSuperClassName; } /** * Get the simple name of the type specified in {@link Factory#type()}. * * @return qualified name */ public String getSimpleFactoryGroupName() { return simpleTypeName; } /** * The original element that was annotated with @Factory */ public TypeElement getTypeElement() { return annotatedClassElement; } }

    Lot of code, but the most important thing happens ins the constructor where you find the following lines of code:

    Factory annotation = classElement.getAnnotation(Factory.class); id = annotation.id(); // Read the id value (like "Calzone" or "Tiramisu") if (StringUtils.isEmpty(id)) { throw new IllegalArgumentException( String.format("id() in @%s for class %s is null or empty! that's not allowed", Factory.class.getSimpleName(), classElement.getQualifiedName().toString())); }

    Here we access the @Factory annotation and check if the id is not empty. We will throw an IllegalArgumentException if id is empty. You may be confused now because previously we said that we are not throwing exceptions but rather use?Messager. That’s still correct. We throw an exception here internally and we will catch that one in?process()?as you will see later. We do that for two reasons:

  • I want to demonstrate that you should still code like in any other java application. Throwing and catching exceptions is considered as good practice in java.
  • If we want to print a message right from?FactoryAnnotatedClass?we also have to pass theMessager?and as already mentioned in “Error Handling” (scroll up) the processor has to terminate successfully to make?Messager?print the error message. So if we would write an error message by using?Messager?how do we “notify”?process()?that an error has occurred? The easiest and from my point of view most intuitive way is to throw an Exception and letprocess()?chatch this one.
  • Next we want to get the?type?field of the?@Factory?annotation. We are interessted in the full qualified name.

    try {Class<?> clazz = annotation.type(); qualifiedGroupClassName = clazz.getCanonicalName(); simpleFactoryGroupName = clazz.getSimpleName(); } catch (MirroredTypeException mte) { DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror(); TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement(); qualifiedGroupClassName = classTypeElement.getQualifiedName().toString(); simpleFactoryGroupName = classTypeElement.getSimpleName().toString(); }

    That’s a little bit tricky, because the type is?java.lang.Class. That means, that this is a real Class object. Since annotation processing runs before compiling java source code we have to consider two cases:

  • The class is already compiled: This is the case if a third party .jar contains compiled .class files with?@Factory?annotations. In that case we can directly access the Class like we do in the?try-block.
  • The class is not compiled yet: This will be the case if we try to compile our source code which has @Factory annotations. Trying to access the Class directly throws aMirroredTypeException. Fortunately MirroredTypeException contains a?TypeMirrorrepresentation of our not yet compiled class. Since we know that it must be type of class (we have already checked that before) we can cast it to?DeclaredType?and access?TypeElementto read the qualified name.
  • Alright, now we need one more datastructure named?FactoryGroupedClasses?which basically groups all?FactoryAnnotatedClasses?together.

    public class FactoryGroupedClasses {private String qualifiedClassName; private Map<String, FactoryAnnotatedClass> itemsMap = new LinkedHashMap<String, FactoryAnnotatedClass>(); public FactoryGroupedClasses(String qualifiedClassName) { this.qualifiedClassName = qualifiedClassName; } public void add(FactoryAnnotatedClass toInsert) throws IdAlreadyUsedException { FactoryAnnotatedClass existing = itemsMap.get(toInsert.getId()); if (existing != null) { throw new IdAlreadyUsedException(existing); } itemsMap.put(toInsert.getId(), toInsert); } public void generateCode(Elements elementUtils, Filer filer) throws IOException { ... } }

    As you see it’s basically just a?Map<String, FactoryAnnotatedClass>. This map is used to map an @Factory.id() to FactoryAnnotatedClass. We have chosen?Map?because we want to ensure that each id is unique. That can be easily done with a map lookup.?generateCode()?will be called to generate the Factory code (discussed later).

    Matching Criteria

    Let’s proceed with the implementation of?process(). Next we want to check if the annotated class has at least one public constructor, is not an abstract class, inherits the specified type and is a public class (visibility):

    public class FactoryProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Factory.class)) { ... // We can cast it, because we know that it of ElementKind.CLASS TypeElement typeElement = (TypeElement) annotatedElement; try { FactoryAnnotatedClass annotatedClass = new FactoryAnnotatedClass(typeElement); // throws IllegalArgumentException if (!isValidClass(annotatedClass)) { return true; // Error message printed, exit processing } } catch (IllegalArgumentException e) { // @Factory.id() is empty error(typeElement, e.getMessage()); return true; } ... } private boolean isValidClass(FactoryAnnotatedClass item) { // Cast to TypeElement, has more type specific methods TypeElement classElement = item.getTypeElement(); if (!classElement.getModifiers().contains(Modifier.PUBLIC)) { error(classElement, "The class %s is not public.", classElement.getQualifiedName().toString()); return false; } // Check if it's an abstract class if (classElement.getModifiers().contains(Modifier.ABSTRACT)) { error(classElement, "The class %s is abstract. You can't annotate abstract classes with @%", classElement.getQualifiedName().toString(), Factory.class.getSimpleName()); return false; } // Check inheritance: Class must be childclass as specified in @Factory.type(); TypeElement superClassElement = elementUtils.getTypeElement(item.getQualifiedFactoryGroupName()); if (superClassElement.getKind() == ElementKind.INTERFACE) { // Check interface implemented if (!classElement.getInterfaces().contains(superClassElement.asType())) { error(classElement, "The class %s annotated with @%s must implement the interface %s", classElement.getQualifiedName().toString(), Factory.class.getSimpleName(), item.getQualifiedFactoryGroupName()); return false; } } else { // Check subclassing TypeElement currentClass = classElement; while (true)

    轉載于:https://www.cnblogs.com/davidwang456/p/5670910.html

    總結

    以上是生活随笔為你收集整理的ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩欧美在线观看一区二区 | 日韩中文字幕免费电影 | 国产白浆在线观看 | 国产精品99久久99久久久二8 | 久久99亚洲热视 | 日韩中文久久 | 婷婷色综合| 午夜精品久久久久久久99无限制 | 精品亚洲va在线va天堂资源站 | 国产精品久久久久影视 | 肉色欧美久久久久久久免费看 | 亚洲精品国产精品99久久 | 99久久这里只有精品 | aaaaaa毛片 | 日韩av播放在线 | 911在线| 日韩欧三级| 天天人人 | 亚洲午夜在线视频 | 日韩网站在线免费观看 | 免费看十八岁美女 | 一区二区三区国 | 久久这里只有精品1 | 亚洲精品美女久久 | 久久精品视频在线 | 免费手机黄色网址 | 日韩电影在线观看一区二区三区 | 亚洲国产剧情av | 在线观看视频一区二区三区 | 2018好看的中文在线观看 | 亚洲片在线资源 | 日韩av片免费在线观看 | 五月天激情综合 | 色婷婷狠狠| 国产精品18久久久久久不卡孕妇 | 99久精品| 久久大片网站 | 国产精品自产拍在线观看蜜 | 成人国产精品一区 | 日韩精品久久一区二区三区 | www.av在线.com| 国产日韩欧美视频在线观看 | 一区二区三区在线免费 | 欧美精品久久久久久久久久 | 色综合久久88色综合天天 | 一区二区三区高清不卡 | 四虎在线免费观看 | 福利av影院 | 超碰人人干人人 | 九九九九免费视频 | 欧美一级看片 | 久草视频在 | 97精品久久 | 国产一级在线观看视频 | 麻豆系列在线观看 | 久久久污 | 欧美国产日韩激情 | 啪啪凸凸 | 亚州欧美精品 | 久久成人一区二区 | av色影院 | 丁香影院在线 | 91传媒激情理伦片 | 色综合久久88色综合天天免费 | 99久免费精品视频在线观看 | 免费av的网站 | 日韩在线小视频 | 婷婷网五月天 | 国产69久久久 | 免费视频成人 | 免费av网站在线 | 精品国产1区 | 久久精品久久精品久久 | 午夜999| 五月情婷婷 | 97免费中文视频在线观看 | av天天澡天天爽天天av | 天堂网一区二区三区 | 福利片视频区 | 成年人黄色免费视频 | 日韩午夜av | 天天色天天 | 欧美亚洲免费在线一区 | 欧美成人黄 | 日韩三级视频在线看 | 久久精品国产一区二区 | 美国三级黄色大片 | 国产美女精品视频 | 久久狠狠亚洲综合 | 欧美男同网站 | 国产色资源 | 九色91福利| 不卡中文字幕在线 | 国产精品女同一区二区三区久久夜 | 最新中文字幕视频 | 日韩精品一区二区三区三炮视频 | 中文在线免费一区三区 | 国产一区二区电影在线观看 | 国产黄色高清 | 美女网站视频久久 | av在线播放快速免费阴 | 一区二区三区 中文字幕 | 狠狠色丁香久久婷婷综合_中 | 伊人中文字幕在线 | 国产黄在线观看 | 日韩大片在线看 | 亚洲成人黄色在线观看 | 97av视频 | 国产成人精品亚洲日本在线观看 | 在线电影播放 | 久久免费电影网 | 国产精品永久在线 | 国产免费久久久久 | 久久婷婷精品视频 | 国产精品黄 | 麻豆一区在线观看 | 久久歪歪 | 99产精品成人啪免费网站 | 五月天综合网站 | 精品不卡视频 | 日韩精品一区二区三区免费观看视频 | 九九热只有这里有精品 | 成人国产精品 | 麻豆视频国产 | 久久国产欧美日韩精品 | 久久久久久久久国产 | 久久国产精品99国产精 | 久久精品久久久久电影 | 天天插日日操 | 日韩久久一区 | 91麻豆精品国产91 | 人人澡超碰碰97碰碰碰软件 | 婷婷性综合| 免费黄色网址网站 | 国产亚洲精品久久久久秋 | 激情伊人 | av网址最新| av综合网址 | 成人精品在线 | 热热热热热色 | 国产精品黄色影片导航在线观看 | 日操干 | 中文字幕专区高清在线观看 | 在线视频精品播放 | 91成人短视频在线观看 | 久热免费 | 免费视频久久久 | 91网在线看 | 国产美女在线免费观看 | 五月天视频网 | 国产成人333kkk | 欧美性高跟鞋xxxxhd | 私人av| 天天操夜夜曰 | 国产一级黄色免费看 | 美女在线观看av | 久久久久久久综合色一本 | 欧美另类美少妇69xxxx | 日韩精品在线播放 | 欧美一级久久久久 | 蜜臀av一区二区 | 婷婷久久一区二区三区 | 久久精品久久99 | 欧美日本啪啪无遮挡网站 | 91中文在线视频 | 色片网站在线观看 | 在线观看日韩免费视频 | 日韩av免费一区二区 | 久久夜色精品国产欧美乱极品 | 日韩免费 | 夜夜视频欧洲 | 五月激情五月激情 | 一本一本久久a久久精品综合 | 黄色三级视频片 | 亚洲最新av在线网站 | 亚洲精品午夜一区人人爽 | 久久精品这里热有精品 | 伊人色**天天综合婷婷 | 国产高清在线看 | 国产打女人屁股调教97 | 99久久精品国产一区 | 91 中文字幕 | 黄色小说免费在线观看 | 日韩欧美国产视频 | 亚洲乱码一区 | 99热在线这里只有精品 | 欧美日韩视频在线观看一区二区 | 国产午夜精品久久 | 亚洲精品高清一区二区三区四区 | 久久综合色一综合色88 | 免费日韩精品 | 久久精品牌麻豆国产大山 | 五月天婷婷免费视频 | 97av精品| 在线小视频国产 | 婷婷久月 | 黄网站免费久久 | 国产视频在线一区二区 | 国产精品久久久久999 | 人人看黄色 | 国产高清免费 | 日韩在线免费视频观看 | 91精品啪在线观看国产81旧版 | 国产中文| 日韩一二三区不卡 | 91高清完整版在线观看 | 天天躁天天躁天天躁婷 | 91九色porny蝌蚪视频 | 久久99热这里只有精品国产 | 九九九九色 | 看v片| 成人在线一区二区三区 | 国产在线一线 | 91在线一区二区 | av在线专区 | 欧美精品xx | www激情久久 | 欧美日韩精品网站 | 色综合亚洲精品激情狠狠 | 久久国产精品系列 | 午夜久久美女 | 91亚洲精品久久久中文字幕 | 99看视频在线观看 | 九色精品| 国产五月婷 | 亚洲成色777777在线观看影院 | www.夜夜爽 | 日韩大片在线 | 蜜臀av网站| 亚洲精品视频在线看 | v片在线看 | av在线官网 | av成人免费在线观看 | 久久精品亚洲精品国产欧美 | 国产精品免费看 | 成人小视频在线免费观看 | 日韩精品一区二区三区中文字幕 | 99视频在线 | 婷婷丁香色 | 香蕉影院在线观看 | 久久久久久久99 | 久草91视频 | 欧美日韩精品久久久 | 成人午夜电影免费在线观看 | 亚洲在线成人精品 | 中文字幕精品一区二区三区电影 | 国内三级在线 | 婷婷视频在线观看 | 激情五月婷婷综合网 | 天天色天天色 | 久久激情片 | 91av社区| 精品在线你懂的 | 日本激情中文字幕 | 国产精品国产三级国产不产一地 | 九九视频在线播放 | 91在线免费公开视频 | 91丨九色丨国产丨porny精品 | 国产黄色片免费观看 | 久久99国产精品免费网站 | 一区二区三区四区免费视频 | 久久综合五月婷婷 | 草草草影院| 韩国在线视频一区 | 97人人射 | 国产成视频在线观看 | 亚洲精品影院在线观看 | 日韩免费二区 | 国产精品小视频网站 | 欧美大片mv免费 | 毛片基地黄久久久久久天堂 | 西西大胆免费视频 | 久久综合9988久久爱 | 久久久国产影院 | 国产成人免费精品 | 美女视频网站久久 | 国产精品video爽爽爽爽 | 国产剧情一区二区 | 久久亚洲综合色 | 成人在线观看资源 | 97国产超碰在线 | 久久精品视频一 | 欧美一区二区三区在线视频观看 | 日本在线观看一区二区三区 | 亚洲手机av| 亚洲精品在线看 | 欧洲精品码一区二区三区免费看 | wwwwww黄| 国产小视频福利在线 | 日本激情中文字幕 | 国产小视频免费在线网址 | 国产精品第一页在线 | 日韩免费 | 国产精品欧美久久久久无广告 | 一区二区三区在线免费观看 | 91资源在线视频 | 国产男男gay做爰 | 亚洲高清视频在线播放 | 中文在线免费看视频 | 亚洲国产一区二区精品专区 | 欧美一区二区在线 | 欧美一级片播放 | 粉嫩av一区二区三区四区 | 久草网在线视频 | 福利视频精品 | 亚洲欧洲一区二区在线观看 | 国产精品白丝jk白祙 | 亚洲欧美日韩不卡 | av中文在线观看 | 91视频免费观看 | 国产1区2区3区精品美女 | 丁香av| 黄色亚洲大片免费在线观看 | 偷拍精品一区二区三区 | 国产三级精品三级在线观看 | 久久露脸国产精品 | 日韩国产欧美在线视频 | 久久久久女人精品毛片 | 久久午夜免费视频 | 国产精品一区二区精品视频免费看 | 亚洲精品国产欧美在线观看 | 国产黄色视 | 超碰人人射 | 中文字幕电影高清在线观看 | 国产精品综合久久久久久 | 一区二区三区精品在线 | 久久久影院官网 | 精品视频免费观看 | 天天天色| 色狠狠综合天天综合综合 | 啪啪资源 | 手机av电影在线 | 在线观看视频在线 | 欧美视频日韩 | 成人精品国产 | 99热这里只有精品在线观看 | 久久9999久久 | 精品在线观 | 国产亚洲aⅴaaaaaa毛片 | 国产一二三四在线视频 | 免费av电影网站 | 波多野结衣一区 | 久久爱www. | 久久午夜精品视频 | 毛片精品免费在线观看 | 久久国产二区 | 成人9ⅰ免费影视网站 | 国产裸体无遮挡 | 麻豆视频www | 久久综合九色综合网站 | 视频99爱| 久久久精品网站 | 国产亚洲永久域名 | 欧美一级片在线 | 久久久黄色av | 国产精品嫩草影视久久久 | 久久激情五月婷婷 | 四虎影视8848aamm | 天天艹天天干天天 | 精品国产成人av | 97av精品 | 你操综合| 日韩精品在线一区 | 久久黄色免费视频 | 丁香花中文字幕 | 久久久伊人网 | 亚洲国产综合在线 | 国产最新在线观看 | 久久国产精品99久久久久 | 99精品亚洲 | 欧美精品一区二区蜜臀亚洲 | 91丨九色丨蝌蚪丨老版 | 丰满少妇在线观看资源站 | 国产精品九色 | 国产一区视频在线观看免费 | 国产高清视频免费观看 | 五月综合色婷婷 | 在线国产精品视频 | 亚洲精品午夜一区人人爽 | 婷婷伊人五月 | 一本一本久久a久久精品综合妖精 | 亚洲aaa毛片| 中文字幕日韩av | 国产在线看 | 国产精品手机在线观看 | 天天操天天摸天天干 | 丁香午夜婷婷 | 91香蕉视频720p | 91麻豆精品一区二区三区 | 98久9在线 | 免费 | 麻豆果冻剧传媒在线播放 | 亚洲第一区精品 | 国产精彩在线视频 | 手机看国产毛片 | 成年人网站免费在线观看 | 欧美老女人xx | 精品人妖videos欧美人妖 | 天天操天天能 | 88av视频 | 国产无套一区二区三区久久 | 在线激情影院一区 | 国产精品乱看 | 最新日韩中文字幕 | 日韩超碰 | 久久香蕉国产 | 久久视讯 | 91麻豆操| 婷婷成人亚洲综合国产xv88 | 永久免费的啪啪网站免费观看浪潮 | 亚洲精品在线观看免费 | 狠狠的日日| 美女视频黄网站 | 精品久久久久久一区二区里番 | 99在线视频观看 | 麻豆传媒视频在线播放 | 一级免费片 | 黄色小网站免费看 | 欧美久久久久久久久久久久 | 天天干天天操天天射 | 中文字幕在线播放一区二区 | 色婷婷狠狠18 | 国产福利资源 | 成人a在线| 亚洲欧洲av | 97免费公开视频 | 免费在线播放 | www.97视频 | 日韩理论片| 国产精品久久久久av福利动漫 | 日韩网站在线免费观看 | 在线有码中文字幕 | 激情婷婷欧美 | 爱色婷婷 | 久久久天堂 | 国产最新视频在线 | 久久中文字幕在线视频 | 九九视频这里只有精品 | 久久天天躁狠狠躁亚洲综合公司 | 成人黄在线观看 | 欧美激情第一区 | 九九久久久久久久久激情 | 一区二区三区免费网站 | 特级a老妇做爰全过程 | 日av免费| 九九热精品视频在线观看 | 在线观看黄av | 精品国产伦一区二区三区观看说明 | 99这里只有久久精品视频 | 女人久久久久 | 婷婷六月在线 | 成人国产精品免费观看 | 中文字幕av播放 | 日韩欧美视频 | 国产一区二区三区四区在线 | 成人在线观看资源 | 视频福利在线 | 欧洲精品久久久久毛片完整版 | 亚洲精品福利在线观看 | 四虎影视成人精品 | 久久视频国产 | av不卡中文 | 久久视奸 | 欧美成人基地 | 亚洲 欧洲 国产 精品 | 最近在线中文字幕 | 日韩高清免费无专码区 | 成人av电影免费在线观看 | 日韩伦理片hd | 中文网丁香综合网 | 狠狠干成人 | 国产麻豆视频网站 | 91亚洲精品久久久 | 国产福利免费在线观看 | 五月天电影免费在线观看一区 | 九九激情视频 | 91精品国自产拍天天拍 | 99热精品国产 | 亚洲永久国产精品 | 九色自拍视频 | 这里只有精品视频在线观看 | 国产成人一区三区 | 亚洲久草在线视频 | 精品少妇一区二区三区在线 | 久久久久久久久久福利 | 中文一区二区三区在线观看 | www最近高清中文国语在线观看 | 亚洲国内精品在线 | 久久久久久久久久久成人 | 欧美久久久久久久久 | 久久99久久99精品中文字幕 | 蜜臀精品久久久久久蜜臀 | 西西44人体做爰大胆视频 | 亚洲精品一区二区三区高潮 | 久久免费看av | 亚洲国产丝袜在线观看 | 亚洲天天综合网 | 久久视频在线免费观看 | 国产精品 9999 | 最新av网站在线观看 | 亚洲人成人在线 | 久久精品一二三区 | 九色91福利 | 国产亚洲精品久久久久久移动网络 | 久久精品欧美一 | 日韩免费电影在线观看 | 免费av在线网 | 四虎8848免费高清在线观看 | 97超在线 | 欧美淫aaa免费观看 日韩激情免费视频 | 中文字幕久久精品亚洲乱码 | 中文字幕中文字幕在线中文字幕三区 | 精品久久片 | 91看片黄色 | 久久天堂精品视频 | 午夜av一区二区三区 | 综合网天天 | 国产精品久久久久婷婷 | 日韩欧美在线一区 | 免费大片av | 久久99国产精品 | 日韩久久久久久久久久 | 一区二区三区手机在线观看 | 国产精品热视频 | 国产精品igao视频网网址 | 在线观看亚洲国产精品 | 婷婷成人亚洲综合国产xv88 | 亚洲精品白浆高清久久久久久 | 一区二区三区四区精品视频 | 成年人免费av | 国产麻豆果冻传媒在线观看 | 亚洲一区二区91 | 91视频 - v11av | 欧美激情操 | 狂野欧美激情性xxxx欧美 | 超级碰碰碰免费视频 | 国产自在线观看 | 久久电影日韩 | 欧洲激情在线 | 亚洲欧洲精品一区二区精品久久久 | 亚洲国产美女精品久久久久∴ | 欧美日比视频 | 久久激情五月丁香伊人 | 国产麻豆精品95视频 | a黄色一级 | 国产精品久久久久久一区二区 | 国产一级在线观看 | 日韩电影中文,亚洲精品乱码 | 江苏妇搡bbbb搡bbbb | 欧美性生爱 | 久久超碰在线 | av在线最新| 中文字幕在 | 国产精品18久久久久久不卡孕妇 | 国内免费久久久久久久久久久 | 午夜国产福利在线观看 | 91精品国产综合久久福利不卡 | 国产特级毛片aaaaaa毛片 | 超碰人人草人人 | 在线视频1卡二卡三卡 | 久久综合五月天 | 国产亚洲精品久久久网站好莱 | 丁香花在线视频观看免费 | 日日操天天爽 | 欧美精品国产综合久久 | 超碰资源在线 | 国产成人精品午夜在线播放 | 伊人婷婷| 日韩欧美精品一区二区 | 日韩欧美精品免费 | 中文字幕日韩免费视频 | 国产欧美在线一区二区三区 | 久久露脸国产精品 | 成人永久在线 | 九九九热精品免费视频观看网站 | 五月婷婷在线视频观看 | 91中文在线观看 | 人交video另类hd | 中文字幕888 | 国内精品久久久久久久久久清纯 | 人人干97| 久操视频在线免费看 | 国产麻豆剧果冻传媒视频播放量 | 中文字幕av全部资源www中文字幕在线观看 | 国产精品毛片一区视频播不卡 | 九九免费在线观看视频 | 99久久这里有精品 | 在线亚洲精品 | 精品五月天| 三级av在线 | 亚洲激精日韩激精欧美精品 | 精品高清美女精品国产区 | 97电影手机| 国产一级一片免费播放放 | 精品一区电影 | 中文国产在线观看 | 视频三区 | 亚洲色图激情文学 | 久草资源免费 | 国产中文字幕一区 | 在线观看黄网 | 久久免费视频在线观看 | 中文字幕大全 | 免费一级片在线 | 丰满少妇在线观看资源站 | 91xav| 中文字幕色在线视频 | 色婷婷五| 日韩视频www | 91欧美国产 | 国产一级视频免费看 | 狠狠激情中文字幕 | 国产精品日韩 | 国产又粗又猛又爽又黄的视频先 | 黄色毛片视频免费 | 国产免费久久久久 | 一区二区三区在线播放 | 免费91麻豆精品国产自产在线观看 | 久久综合之合合综合久久 | 国产精品入口传媒 | 精品国产精品久久 | 在线观看黄网站 | 99成人精品 | 丝袜美腿在线播放 | 日韩欧美一区二区在线观看 | 91超碰在线播放 | 国产精品 国内视频 | 在线免费观看涩涩 | 天堂av在线网站 | 午夜婷婷在线观看 | 国产91免费看 | 探花视频免费观看高清视频 | 97电影网站 | 又爽又黄又刺激的视频 | 日韩网站一区 | 午夜视频在线观看欧美 | 99热这里只有精品1 av中文字幕日韩 | 99精品一区 | 十八岁以下禁止观看的1000个网站 | 久久精品国产99国产 | 欧美精品999 | 亚洲精选在线观看 | 综合色在线观看 | 亚洲综合视频在线观看 | 天操夜夜操 | 久久精品福利 | 天天干人人插 | 99在线高清视频在线播放 | 麻豆精品传媒视频 | 国产在线观看免 | 好看av在线| 国产成人精品一区在线 | 久久在视频| 手机av看片| 日日夜夜婷婷 | 免费观看视频黄 | 97精品久久人人爽人人爽 | 久草在线在线 | 日韩免费久久 | 97人人模人人爽人人喊网 | 久久精品国产免费看久久精品 | 在线观看中文字幕视频 | 在线免费观看的av网站 | 久久久国产一区二区三区四区小说 | 天天插天天| 久久久久久久久久久综合 | 国产午夜麻豆影院在线观看 | 久久久久麻豆 | 69av久久| 久久久久亚洲精品中文字幕 | 一区在线电影 | 精品国产视频一区 | 国产高清精品在线 | 91成人蝌蚪 | 国产男女免费完整视频 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日本精品一区二区在线观看 | 美女网站在线免费观看 | 99 视频 高清 | 激情狠狠干 | 久草在线资源网 | 国产91精品久久久久 | 久久精品观看 | 东方av在线免费观看 | 日韩v欧美v日本v亚洲v国产v | 国产在线观看一区 | 伊人五月天综合 | 国产成人精品亚洲a | 成年人免费在线观看网站 | 亚洲精品天天 | 一区二区激情视频 | www.操.com | 国产伦精品一区二区三区高清 | 国产 在线观看 | 日韩一区正在播放 | 美女国内精品自产拍在线播放 | 四虎国产 | 色综合咪咪久久网 | 久久歪歪| 亚洲国产操| 国产精品系列在线观看 | 免费h视频 | 日韩精品一区二区三区电影 | 精品99久久久久久 | 99 视频 高清 | 久久精品96| 在线免费观看成人 | av三级在线播放 | 最新国产中文字幕 | 国产精品一区二区吃奶在线观看 | 色网站在线 | 国产视 | 91精品视频免费在线观看 | 日韩理论电影网 | 久久久久久久久久久久影院 | 国产99久久九九精品免费 | 天天摸日日摸人人看 | 99成人在线视频 | 免费亚洲片 | 免费午夜视频在线观看 | 久久国产精彩视频 | 日女人免费视频 | av激情五月 | 四虎影视成人永久免费观看视频 | 日本精品va在线观看 | www黄色 | 99热精品在线 | 97超碰中文字幕 | 91伊人影院| av在线等| 色综合久久久久久久久五月 | 97视频人人免费看 | 国产精品中文 | 亚洲成人av一区二区 | av解说在线 | 亚洲精品a区 | 美女视频一区 | 婷婷综合伊人 | 精品视频在线播放 | 97人人超 | 亚洲一级特黄 | 亚洲欧洲一区二区在线观看 | 三级黄色网址 | 黄色网址在线播放 | 久久呀 | 在线观看精品 | 涩av在线| 久久黄色片子 | 九九九热精品免费视频观看 | 中文字幕精品久久 | 日韩免费在线观看视频 | 91麻豆精品国产91久久久久久 | 国产只有精品 | 欧美性色19p | 日韩av免费一区二区 | 亚洲精品在线观看中文字幕 | 天天插天天干 | 狠狠操狠狠 | 天天操天天操天天操天天操天天操天天操 | 在线99 | 亚洲午夜久久久久久久久 | 国产免费三级在线观看 | 一区二区欧美日韩 | 亚洲高清在线观看视频 | 久久久精品综合 | 成年人视频免费在线 | 久久久久久精 | 国产不卡一| 人人爱爱 | 亚洲国产精品99久久久久久久久 | 国产成人精品一区二区三区网站观看 | 91精选在线| 久av电影| 国产精品成人a免费观看 | 天堂视频一区 | 久久五月天色综合 | 三级av中文字幕 | 亚洲精品乱码久久久久久蜜桃动漫 | 亚洲乱码精品久久久久 | 成人香蕉视频 | 91亚洲网 | 久久精品久久精品 | 99热999 | 黄色网中文字幕 | 福利视频精品 | 天天操天天干天天爽 | 日本中文字幕在线免费观看 | 色永久免费视频 | 国产精品理论在线观看 | 色综合久久久久久中文网 | 欧美a视频在线观看 | 日韩在线不卡视频 | 中文字幕在线观看第一区 | 久草新在线 | 日韩二区在线 | 久久久久久久久久影院 | 欧美高清视频不卡网 | 六月激情婷婷 | 97超碰站 | 在线看片一区 | 国产成人精品综合久久久久99 | 美女久久网站 | 日韩免费电影网站 | 91一区啪爱嗯打偷拍欧美 | 午夜精品99久久免费 | 精品一区91 | 国产色婷婷精品综合在线手机播放 | av成人免费在线 | 香蕉视频最新网址 | 日本韩国精品在线 | 日韩久久精品一区二区三区下载 | 日韩黄色在线电影 | free. 性欧美.com | 国产不卡av在线 | 亚洲黄色在线 | 国产亚洲婷婷免费 | 亚洲少妇激情 | 99精品网站 | 日韩免费福利 | 激情欧美丁香 | 一区二区三区四区五区在线 | 天天综合网 天天综合色 | 亚洲成av人片在线观看 | 天天摸天天舔天天操 | 91精品区| av888.com| 国产一区二区在线免费播放 | 免费高清无人区完整版 | 久久99精品久久久久久清纯直播 | 九九视频网站 | 国内免费久久久久久久久久久 | 天天干天天综合 | 97精品超碰一区二区三区 | 亚洲一区网 | 黄色午夜 | 国产又粗又硬又爽视频 | 999国产在线 | 黄色免费网站大全 | 欧美一区二区三区在线 | 99在线免费观看视频 | 观看免费av| 国产传媒一区在线 | 麻豆国产精品视频 | 人人超碰在线 | av在线亚洲天堂 | ww视频在线观看 | 国产一级在线免费观看 | 久久久三级视频 | 久久精品亚洲综合专区 | 偷拍精品一区二区三区 | 久草在线观看资源 | av电影免费 | 国产乱对白刺激视频在线观看女王 | 人人爽人人舔 | 九九视频在线播放 | 欧洲精品在线视频 | 99久久精品免费看国产四区 | 亚洲一级久久 | 久久久久亚洲精品成人网小说 | 亚洲一级电影在线观看 | 久久精品1区 | 少妇bbw撒尿| 在线观看视频一区二区三区 | 色就干| 97视频精品 | 国产麻豆果冻传媒在线观看 | 天天草天天摸 | 日韩精品高清不卡 | 狠狠色狠狠色综合日日小说 | 视频在线观看国产 | 日韩有码中文字幕在线 | 久久精品在线免费观看 | 探花视频免费观看 | 精品美女久久 | 97视频总站| 96超碰在线| 中文字幕av播放 | 最近2019年日本中文免费字幕 | 91av在线播放 | 亚洲免费婷婷 | 99视频免费播放 | 亚洲精品18p | 久久精品国产免费看久久精品 | 成人黄色电影免费观看 | 精品国产一区二区三区免费 | 亚洲天堂社区 | 国产亚洲欧美精品久久久久久 | 手机在线观看国产精品 | 国产精品一区电影 | 日本精品久久久久中文字幕 | 一区二区三区精品在线视频 | 高清一区二区三区av | 国产不卡av在线 | 午夜久久精品 | 久久伊人八月婷婷综合激情 | 伊色综合久久之综合久久 | 国产小视频你懂的 | 一级理论片在线观看 | a色视频| 亚洲欧美国产日韩在线观看 | 久久一区二区三区超碰国产精品 | a天堂最新版中文在线地址 久久99久久精品国产 | 日本资源中文字幕在线 | 天天玩夜夜操 | 黄色的网站免费看 | 免费国产视频 | 黄色在线看网站 | 日本中文字幕在线一区 | 毛片久久久 | 国产中出在线观看 | 深爱激情综合网 | av中文字幕在线观看网站 | 久久久五月婷婷 | 一区二区三区在线观看免费 | 91精品一区二区在线观看 | 国产一区二区影院 | 婷婷丁香久久五月婷婷 | 久久精品老司机 | 黄色91在线观看 | 在线观看亚洲国产精品 | 182午夜在线观看 | 在线观看免费av片 | 亚洲自拍偷拍色图 | 久久精品国产精品亚洲精品 | 超碰av在线 | 免费色网站| 色婷婷色 | ww亚洲ww亚在线观看 | 亚洲第一av在线 | 亚洲另类xxxx | 超黄视频网站 | av中文字幕在线看 | 三级在线视频观看 | 久久久久久蜜av免费网站 | 99精品视频在线看 | 黄色特级片 | 美女网站视频免费黄 | 婷婷丁香色综合狠狠色 | 国产精品 日韩 | 亚洲欧美一区二区三区孕妇写真 | 成年人在线视频观看 | 亚洲 欧洲 国产 日本 综合 | 日韩视频免费看 | 国产精品久久久久av福利动漫 | 九九久久精品视频 | 亚洲网站在线 | 中文字幕在线观看第一区 | 日韩理论影院 | 亚洲电影在线看 | 亚洲国产精彩中文乱码av | 日韩免费看视频 | 狠狠色狠狠色综合日日小说 | 人人超碰免费 | 2019国产精品 | 国外av在线 | 免费看片成人 | 91天天视频 | 亚洲男男gⅴgay双龙 | 亚洲成人黄色av | 欧美日韩超碰 | 激情欧美xxxx | 国产综合精品久久 | 六月丁香伊人 | 亚洲精欧美一区二区精品 | 人人插超碰 | 99九九99九九九视频精品 | 九九视频网站 | 日韩高清一区在线 | 久久综合久色欧美综合狠狠 | 欧美激情视频三区 | 亚洲性xxxx | 亚a在线| 久久成人精品视频 | 国产色在线观看 | 99热手机在线 | 黄色一级免费 | 亚洲老妇xxxxxx | 伊人超碰在线 | 久久99网 | 在线观看免费一级片 | av网站有哪些 | 国产精品久久久影视 | 奇米导航 | 欧美日韩在线精品 | 久久久久久久国产精品视频 | 欧美精品久久久久久久久久 | 8x成人免费视频 | 天天射天天舔天天干 | 国产成人精品久久二区二区 | 96av在线视频 | 精品在线观看免费 | 亚洲码国产日韩欧美高潮在线播放 | 91丨九色丨蝌蚪丨对白 | 亚洲伊人婷婷 | 少妇超碰在线 | 日韩欧美电影在线观看 | 亚洲另类xxxx | 日日爽天天爽 | 综合色站 |