日韩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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    成人在线观看av | 中文字幕精品一区二区精品 | 一区在线免费观看 | 又黄又爽的免费高潮视频 | 又粗又长又大又爽又黄少妇毛片 | 2019中文字幕网站 | 香蕉视频国产在线 | 免费日韩一区二区三区 | 国产91电影在线观看 | 三级视频日韩 | 园产精品久久久久久久7电影 | 成人av教育 | 亚洲精品无 | 欧美婷婷综合 | 五月宗合网 | 欧美黄网站 | 在线观看黄av | 97超碰伊人 | 中文字幕一区二区三区久久 | 麻豆精品传媒视频 | 免费精品国产 | www.久久视频| 国产精品久久伊人 | 亚洲激情网站免费观看 | 成人在线一区二区三区 | 综合中文字幕 | 一区二区三区在线电影 | 国产精品成人自产拍在线观看 | 久久成人免费电影 | 国产99久久久国产 | 中文字幕乱在线伦视频中文字幕乱码在线 | 一级成人在线 | 成人av高清在线观看 | 中文字幕欧美日韩va免费视频 | 亚洲精品在线观看不卡 | 在线免费av播放 | 成人一级在线 | 美女免费电影 | 最近中文字幕免费 | 五月天婷婷狠狠 | 日韩 在线观看 | 香蕉在线观看 | 国产精品久久久亚洲 | 最新日韩视频在线观看 | 日本成人中文字幕在线观看 | 毛片网站在线看 | 五月婷婷六月丁香在线观看 | 在线观看视频亚洲 | 玖玖玖在线观看 | 99视频一区二区 | 日韩高清一区在线 | 成人国产网址 | 欧美日韩伦理一区 | 日韩精品一区二区电影 | 久久黄色a级片 | 国产精品一区二区久久精品爱微奶 | 国产日韩精品一区二区三区 | 日韩电影中文,亚洲精品乱码 | 国产精品一区二区三区99 | 天天操天天玩 | 国产99久久久国产精品成人免费 | 欧美成人播放 | 欧美日韩精品在线观看视频 | 91麻豆免费视频 | 99久久久国产精品免费观看 | 久久高清av | 亚洲激情av | www国产亚洲精品久久麻豆 | 欧美肥妇free | 久久成人国产精品入口 | 丁香久久综合 | 国产999精品久久久久久绿帽 | 亚洲成人资源 | 国产精品24小时在线观看 | 精品一区二区三区香蕉蜜桃 | av中文电影 | 精品久久精品久久 | 国产成人精品一区二区三区免费 | 亚洲欧美视频一区二区三区 | 日韩一级黄色av | 91av电影 | 国产97视频在线 | 久久黄色a级片 | 五月婷婷综合激情网 | 中文字幕一区二区三 | 日韩三级视频在线观看 | 伊人国产视频 | 日本特黄一级片 | 69久久99精品久久久久婷婷 | 欧美成人日韩 | 午夜精品电影 | 国产日韩精品一区二区三区在线 | 久久久久久久久综合 | 国产一级电影网 | 激情av五月婷婷 | 国产免费成人 | 国产99亚洲 | 国产 在线 高清 精品 | 久久专区| 97人人射| 开心综合网| 999超碰 | 一区中文字幕 | 国产精品 中文字幕 亚洲 欧美 | 一区二区三区视频在线 | 国产精品成人免费一区久久羞羞 | 免费在线| 婷婷丁香色 | 亚洲午夜精品久久久久久久久 | 亚洲视频在线播放 | 久久久精品在线观看 | 日本夜夜草视频网站 | 成人黄色小说在线观看 | 国产一区二区成人 | 亚洲 欧美 国产 va在线影院 | 午夜在线免费观看 | 色婷婷综合久久久久 | www.天天干 | 精品久久1 | 成人av在线看 | 99视频国产在线 | 九九热免费视频在线观看 | 国产一区在线精品 | 五月天婷婷在线观看视频 | 国产系列精品av | 96av麻豆蜜桃一区二区 | 成片视频免费观看 | 日韩三级精品 | 狠狠干天天射 | 欧美另类巨大 | 亚洲第一区精品 | 91最新视频在线观看 | 亚洲精品合集 | 欧美性黄网官网 | 色婷久久| 国产成人精品福利 | 国产三级午夜理伦三级 | 最新亚洲视频 | 天天干,夜夜操 | 狠狠干.com| av日韩在线网站 | 色婷婷成人网 | 欧美日韩精品在线免费观看 | 91九色国产| 97精品国自产拍在线观看 | 69av国产 | 天天搞夜夜骑 | 国产精品高潮在线观看 | 亚洲午夜在线视频 | 91精品久久久久久粉嫩 | 免费在线观看成人小视频 | 久久成人在线视频 | 欧美性生活一级片 | 精品在线免费观看 | 亚洲精品美女免费 | 午夜视频在线观看网站 | 国产精品视频永久免费播放 | 天天躁天天狠天天透 | 亚洲精品 在线视频 | 特级毛片在线免费观看 | 久久黄色精品视频 | 国产精品一区专区欧美日韩 | 色婷婷av一区二 | 九九九九九九精品 | 福利网址在线观看 | 日韩理论 | 水蜜桃亚洲一二三四在线 | 日产中文字幕 | 成人av免费网站 | 欧美一级片免费在线观看 | 香蕉手机在线 | 日韩av电影一区 | 亚洲成人av电影 | 国产精品久久久久久久免费观看 | 欧洲激情综合 | 蜜臀av夜夜澡人人爽人人 | 色婷婷精品 | 天天操天天爱天天干 | 日躁夜躁狠狠躁2001 | 天天射天天射天天 | 久久精品视频18 | 国产视频精品久久 | 久久视频在线观看中文字幕 | 黄色1级毛片 | 亚洲精品中文在线资源 | 日日爽天天爽 | 99一级片| 99精品国产一区二区 | 99在线免费观看视频 | 久久激五月天综合精品 | 久草网站| 亚洲精品国偷拍自产在线观看蜜桃 | 国产va精品免费观看 | 91香蕉国产在线观看软件 | 色大片免费看 | 亚洲精品久久久久久久不卡四虎 | 粉嫩aⅴ一区二区三区 | 国产特级毛片aaaaaaa高清 | 综合久久2023 | 久久综合久久综合久久综合 | 成人av在线影视 | 久久成人麻豆午夜电影 | 天天综合亚洲 | 国产艹b视频 | 久久综合亚洲鲁鲁五月久久 | 成人动漫一区二区 | 欧美极品久久 | 国产精品成人免费一区久久羞羞 | 婷婷新五月 | 婷婷久草| 亚洲一区网 | 欧美日韩国产综合一区二区 | 成人a级免费视频 | 97超级碰碰碰碰久久久久 | 成人午夜在线观看 | 久久国产精品久久精品国产演员表 | 最新国产一区二区三区 | 日日日日日 | 亚洲aⅴ一区二区三区 | 国产精品久久久久久久久久久免费看 | 天天干天天干天天色 | 亚洲精品国产欧美在线观看 | 日韩不卡高清视频 | 国产资源中文字幕 | 国产精品一区二区在线观看免费 | 97电影在线观看 | 干狠狠| 久久久久婷| 日韩专区视频 | 久草在线视频首页 | 国产亚洲精品久久久久动 | 亚洲一区二区三区四区精品 | 色综合久久久久综合 | 日韩精品资源 | 手机在线看a | 在线观看免费版高清版 | 国产视频在线观看一区 | www.黄色片网站 | 中文字幕 在线 一 二 | 天天色天天射天天综合网 | 久草免费在线观看视频 | 色99网| 久久女同性恋中文字幕 | 91黄视频在线观看 | 婷婷丁香激情网 | 色吊丝在线永久观看最新版本 | 九九色综合 | 久久er99热精品一区二区三区 | 国产九九九视频 | 国产精品美女www爽爽爽视频 | 天天·日日日干 | www.日韩免费 | 国产69精品久久99的直播节目 | 福利一区二区三区四区 | 亚洲黄色免费电影 | 九九九国产 | 国产精品成人一区二区三区吃奶 | 国产精品毛片一区二区在线看 | 免费福利视频网站 | 天天操天天爽天天干 | 一区二区三区免费在线 | 免费99精品国产自在在线 | 国产美女免费观看 | 超碰在线最新地址 | 狠狠干天天色 | 伊人久久一区 | 久久成人午夜 | 国产在线精品观看 | 特级西西www44高清大胆图片 | 欧美激情一区不卡 | 亚洲综合丁香 | 欧美天天综合 | 狠狠色噜噜狠狠狠狠 | 国产麻豆精品一区 | 成人一级片视频 | 涩涩色亚洲一区 | 日本中文字幕在线一区 | 国产精品免费视频观看 | www.狠狠操.com | av免费在线免费观看 | 四虎影视国产精品免费久久 | 丁香九月激情 | 在线观看成人网 | 久免费视频 | 蜜臀久久99精品久久久无需会员 | 国产女教师精品久久av | 99视频这里只有 | 黄色在线成人 | 99视频在线免费看 | 91视频久久久 | 四虎国产精品成人免费影视 | 国产精品永久免费观看 | www久久com| 五月激情电影 | 日韩r级在线 | 青青草久草在线 | 国产99一区视频免费 | www.99av| 免费网站v | 中文字幕免费不卡视频 | 天堂av在线 | 91色偷偷| 在线国产激情视频 | 91亚·色| 91香蕉视频好色先生 | 久久y | 中文字幕在线视频国产 | 蜜臀av性久久久久av蜜臀妖精 | 欧美精品一区二区免费 | 成人91免费视频 | 99精品视频免费全部在线 | 麻豆91精品视频 | 成人午夜在线电影 | 亚洲欧美日韩国产一区二区 | 99精品国产免费久久久久久下载 | 在线91精品 | 精品国产大片 | av在线进入 | 99久久精品无码一区二区毛片 | 久久精品高清 | 少妇激情久久 | 欧美99久久 | 国产不卡av在线播放 | 亚洲一二三在线 | 欧美在线观看视频 | 日韩一区二区三区不卡 | 香蕉网在线观看 | 日本中文字幕网站 | 久久久久免费精品国产 | 久草免费在线观看 | 伊人成人激情 | 久久视频二区 | avove黑丝| 99爱视频在线观看 | 特级片免费看 | 一级黄色片在线播放 | 欧美 激情 国产 91 在线 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 激情丁香在线 | 中文字幕国产精品一区二区 | 日日夜夜天天 | 亚洲丁香日韩 | 91精品国产自产在线观看 | 欧美xxxxx在线视频 | 久久有精品 | 国产一区在线精品 | www.久久爱.cn | 国产精品伦一区二区三区视频 | 日韩av电影中文字幕在线观看 | 手机看片国产日韩 | 中文字幕 国产专区 | 日韩精品视频一二三 | 久久久午夜精品福利内容 | 国产福利a | 婷婷伊人综合 | 日韩精品一区二区三区丰满 | 草久电影 | 久久一二三四 | 久久久资源 | 一本一道久久a久久精品蜜桃 | 久久精品国产一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品网址在线观看 | 久久久伦理 | 久久成人一区 | 亚州天堂 | 一级片色播影院 | 亚洲精品欧美专区 | 久久久久在线 | 在线欧美a | 国产精品久久久久久久久久久久午 | 中国精品少妇 | 国产精品理论片在线观看 | 久久综合九色综合97婷婷女人 | 国产精国产精品 | 黄a在线 | 久久精品国产精品亚洲精品 | 91av官网| 国产伦理久久精品久久久久_ | 国产美女搞久久 | 久国产在线播放 | 日韩a在线看 | 99久久日韩精品免费热麻豆美女 | 精品国产一二三四区 | 精品久久久久久一区二区里番 | 国产成人精品一区二区三区免费 | 99在线免费视频观看 | 91视视频在线直接观看在线看网页在线看 | 久久99免费观看 | 色九九视频 | 国产精品久久久久久电影 | 人人精久 | 久久久久久久久久久久影院 | 国内精品久久天天躁人人爽 | 国产亚洲精品电影 | 在线激情av电影 | 国内精品久久久久影院一蜜桃 | 亚洲伊人av | 日韩最新在线视频 | 97碰碰精品嫩模在线播放 | 日韩无在线 | 日韩av片免费在线观看 | 亚洲精品网站在线 | 99精品免费久久久久久日本 | 亚洲成人午夜在线 | 日本大尺码专区mv | 亚洲综合视频在线 | 中文字幕乱码电影 | 成人一级在线观看 | 日韩精品视频在线观看免费 | 国产一区二区三区高清播放 | 免费在线观看a v | 一区二区三区视频网站 | 欧洲亚洲国产视频 | 99精品久久99久久久久 | 国产麻豆剧传媒免费观看 | 国产999精品久久久久久 | 在线视频app | 中文字幕高清免费日韩视频在线 | 在线免费中文字幕 | 国产精品成人一区二区 | 99欧美 | 蜜臀久久99精品久久久无需会员 | 最新的av网站 | 精品一区二区免费 | 麻豆播放 | 久久69精品久久久久久久电影好 | 色婷婷www | 亚洲最新视频在线播放 | 免费99视频 | 国产视频一区二区在线观看 | 人人添人人澡 | 久久久久综合视频 | 亚洲精品黄网站 | a黄色片在线观看 | 色婷婷av国产精品 | 操操操日日日干干干 | 亚洲精品国久久99热 | 在线观看激情av | 久久久久免费精品国产小说色大师 | 免费看三级 | 亚洲婷婷在线视频 | 500部大龄熟乱视频使用方法 | 夜色资源站wwwcom | 在线观看日本高清mv视频 | 亚洲经典视频 | 国产精品视频app | 狠狠操.com| 999视频网 | 日韩超碰 | 天天射天天舔天天干 | 在线观看日韩视频 | 在线观看www视频 | 久久久久在线 | 久久美女精品 | 天天操天天射天天操 | 丝袜足交在线 | 国产精品第10页 | 成年美女黄网站色大片免费看 | www.夜夜爱 | 婷婷久久一区二区三区 | 亚洲精品黄 | 国产精品va在线播放 | 久久综合色天天久久综合图片 | 日本aaaa级毛片在线看 | 久久久不卡影院 | 欧美性网站 | av在线网站大全 | 色av资源网 | 黄色中文字幕 | 久久人人爽人人爽人人片av免费 | 日韩美女免费线视频 | 免费黄av| 婷婷色5月| 成人一级在线观看 | 久久精品韩国 | 国产裸体无遮挡 | 日韩一二三区不卡 | 国产一区在线免费 | 精品国产伦一区二区三区免费 | 亚洲va欧美va人人爽 | 青春草视频 | 久久久久久久久久影院 | 成年人免费在线观看 | 久久久久久久电影 | 99免费在线 | 狠狠做深爱婷婷综合一区 | 91丨九色丨蝌蚪丰满 | 欧美色伊人 | 亚洲欧美国产视频 | 日韩视频中文 | 亚洲成人蜜桃 | av福利在线看 | 欧美精品久久久久久久久免 | 999国产| 在线电影日韩 | 欧美久久久久久久 | 美女av在线免费 | 91欧美视频网站 | 成人av在线看 | 午夜精品久久久久久久爽 | 日产乱码一二三区别在线 | 91亚洲精品乱码久久久久久蜜桃 | 国产在线观看污片 | av官网在线 | 久久免费久久 | 狠狠干天天射 | 在线视频 影院 | 丁香九月婷婷 | 337p欧美 | 超碰av在线 | 一区二区精品在线观看 | 中文字幕文字幕一区二区 | 91桃色免费观看 | 久在线观看 | 欧美性受极品xxxx喷水 | 久久久久久久久影视 | 国产精品九九视频 | 国产成人福利在线观看 | 国产精品一区二区白浆 | 日日草天天干 | 国产精品地址 | 久草视频资源 | 免费在线观看污网站 | 天天射天天干天天爽 | 亚洲精欧美一区二区精品 | 日日干日日色 | 六月激情婷婷 | 成人在线免费观看网站 | 久久久久久美女 | 91精品推荐| 亚洲国产成人在线 | 免费在线视频一区二区 | 在线黄色国产电影 | 久草在线资源视频 | 国产精品麻豆免费版 | 国产淫片免费看 | 久久亚洲二区 | 伊人手机在线 | 国内精品久久影院 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | av电影不卡 | av黄色免费在线观看 | 青草视频在线看 | 狠狠的操狠狠的干 | 91精品国产92久久久久 | 国产高清第一页 | 免费高清影视 | 欧美一级在线观看视频 | 国产一区二区电影在线观看 | 日韩久久影院 | 国产手机视频精品 | 欧美日韩1区2区 | 久久久久久久久久久久久久电影 | 伊人精品在线 | 丁香电影小说免费视频观看 | 国产免费一区二区三区网站免费 | 欧美日韩高清在线观看 | 日韩理论片 | 国产一区二区电影在线观看 | 精品国自产在线观看 | 国产尤物一区二区三区 | 91完整版| 五月天激情综合 | 欧美日韩精品国产 | 久久私人影院 | 特级黄色视频毛片 | 亚洲精选视频免费看 | 亚洲激情在线观看 | 久草在线最新视频 | 91视频免费看片 | 97视频免费在线看 | 国产一区在线不卡 | 69国产精品视频 | 激情综合中文娱乐网 | 黄色免费网战 | 色99网| 91久久久久久久一区二区 | 日韩,中文字幕 | 成年人免费在线播放 | 精品国产99国产精品 | 亚洲一区二区三区在线看 | 色吊丝在线永久观看最新版本 | 国产一区二区高清 | 中文字幕丝袜制服 | 高潮久久久久久久久 | 亚洲精品国产自产拍在线观看 | 久久男女视频 | 国产成人久久77777精品 | 亚洲网久久 | 91亚州| 69视频永久免费观看 | 国产资源免费在线观看 | 丁香六月婷 | 国产手机av | 午夜精品一区二区三区视频免费看 | 国产免费一区二区三区最新6 | 久久男人影院 | 992tv又爽又黄的免费视频 | 国产精品亚 | av电影在线观看完整版一区二区 | 日韩专区在线观看 | 国内精自线一二区永久 | 婷婷丁香色 | 六月婷婷久香在线视频 | 五月婷婷开心 | 亚洲另类久久 | 欧美精品久久 | www.xxx.性狂虐 | 欧美 日韩 视频 | 国产精品男女 | 成人影音av | 国产精品国产三级国产不产一地 | 精品国产伦一区二区三区观看体验 | 日韩av中文在线 | 正在播放亚洲精品 | 人人干97| 国产美女在线免费观看 | 精品一区二区在线观看 | 天天干天天拍天天操天天拍 | 午夜三级理论 | av大全在线观看 | 日韩美女一级片 | 99综合电影在线视频 | 日本夜夜草视频网站 | 97热久久免费频精品99 | 91中文字幕一区 | 久久精品999 | 黄色一级免费网站 | 婷婷综合导航 | 成人av免费在线播放 | 2018精品视频| 久久99热精品 | a在线观看视频 | 免费电影一区二区三区 | 免费视频成人 | 欧美日韩国产伦理 | 亚洲成人黄色在线 | 天天干天天做天天爱 | 国产老太婆免费交性大片 | 婷婷精品在线 | 天天操夜夜操夜夜操 | 国产成人精品一二三区 | 亚洲乱码一区 | 天天干天天拍天天操天天拍 | 久久精品视频在线观看免费 | 成人香蕉视频 | 2017狠狠干 | 天天拍天天操 | 欧美成人性网 | 丁香六月婷婷激情 | 天天爽夜夜爽精品视频婷婷 | 国产精品久久久久久久久久久久久久 | 91九色在线视频 | 日韩中文字幕免费看 | 婷婷亚洲综合五月天小说 | 国产精品永久在线 | 国内精品久久久久影院日本资源 | 久久精品日本啪啪涩涩 | 最近日本mv字幕免费观看 | 欧美aⅴ在线观看 | 97色狠狠| 久久视频99 | 黄视频网站大全 | 91 在线视频播放 | 黄色在线免费观看网址 | 91在线视频观看 | 99精品视频在线观看 | www亚洲国产 | 91香蕉国产在线观看软件 | 激情综合色综合久久 | 久久久黄色免费网站 | 麻豆视频国产 | 去干成人网 | 欧美亚洲国产精品久久高清浪潮 | 中文字幕色婷婷在线视频 | 国产剧情一区二区在线观看 | 精品久久一 | 丁香伊人网 | 99色在线视频 | 成人久久国产 | 久久国产免费看 | 毛片网站在线观看 | 国产破处在线视频 | 久久久精品欧美一区二区免费 | 久久精品理论 | 国产精品无 | 亚洲电影成人 | 久草在线免费新视频 | 日韩三级免费 | 久久精品久久久久久久 | 黄色小网站在线观看 | 日韩在线首页 | 精品一区二三区 | 91尤物在线播放 | 91探花国产综合在线精品 | 国产精品字幕 | 久久91网| www国产亚洲精品久久麻豆 | 日韩av福利在线 | av中文字幕亚洲 | 九色琪琪久久综合网天天 | 国产成人在线观看免费 | 国产精品18久久久久久vr | 激情av在线资源 | 麻豆视频免费在线观看 | va视频在线观看 | 亚洲精品免费在线 | 亚洲精品 在线视频 | 在线免费视频 你懂得 | 1024手机在线看 | av一级免费 | 国产亚洲成av人片在线观看桃 | 欧美另类xxxxx | 婷婷色九月 | 97在线观看免费视频 | 国产一区视频在线播放 | 五月综合色 | 成人精品一区二区三区中文字幕 | 这里有精品在线视频 | 国产99久久久精品 | 天干啦夜天干天干在线线 | 欧美肥妇free | 国产精品淫片 | 中文av网 | 成人免费共享视频 | 国产999精品久久久影片官网 | 色婷丁香 | 婷婷婷国产在线视频 | 片黄色毛片黄色毛片 | 狠狠狠狠狠狠狠狠 | 九九视频这里只有精品 | 999成人 | 中文字幕美女免费在线 | avv天堂| 国产玖玖视频 | 欧洲一区二区三区精品 | 97超碰人人澡 | 精品一区二区久久久久久久网站 | 国产成人av网站 | 黄色在线视频网址 | 91色在线观看视频 | 97av免费视频 | 香蕉成人在线视频 | 精品久久久免费 | 国产午夜三级 | 欧美aaaxxxx做受视频 | www麻豆视频 | 99视频免费| 国产一区在线看 | 国产在线超碰 | 日韩在线电影一区二区 | 91中文字幕在线播放 | 五月av在线 | 国产精品高潮久久av | a'aaa级片在线观看 | 手机av在线免费观看 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 一区二区三区在线电影 | 日韩激情一二三区 | 91精品国产高清自在线观看 | 99在线精品视频在线观看 | 久久久穴 | 日韩在线观看免费 | 超碰精品在线 | 婷婷成人亚洲综合国产xv88 | 丁香五婷| 欧美精品资源 | 又黄又爽又色无遮挡免费 | 午夜性色 | 成人h视频在线播放 | 国产人成一区二区三区影院 | 最新av网站在线观看 | 国产精品不卡在线 | 中文字幕在线观看的网站 | 久久人人爽人人人人片 | 狠狠躁夜夜a产精品视频 | 日韩av资源站 | 免费69视频 | 天天综合天天做天天综合 | 亚洲视频电影在线 | 日韩精品字幕 | 亚洲国产精品电影 | 在线观看的av | 国产精品美女免费 | 97精品伊人| 国产我不卡 | 国产精品自产拍在线观看网站 | 青青河边草免费观看完整版高清 | 国产麻豆精品在线观看 | 91成人欧美| 美女在线观看网站 | 欧美激情亚洲综合 | 99视频精品视频高清免费 | 亚洲视频免费在线看 | av电影免费在线 | 亚洲免费观看在线视频 | 五月天激情综合 | 一区二区精| 日韩国产精品一区 | 日韩综合在线观看 | 2018好看的中文在线观看 | 久久精品久久精品久久39 | 在线观看国产日韩 | 精品国产自在精品国产精野外直播 | 午夜久久 | 亚洲精品美女免费 | 视频在线观看入口黄最新永久免费国产 | 91视视频在线直接观看在线看网页在线看 | 久久国产91 | 国产91精品看黄网站在线观看动漫 | 国产成人在线免费观看 | 在线观看中文字幕网站 | 欧美黑人性爽 | 成人在线视频在线观看 | 九九久久久久久久久激情 | 在线 成人| 五月天视频网 | 91精品在线看 | 国产91全国探花系列在线播放 | 亚洲综合成人在线 | 精品国产一区二区三区四 | 欧美激情精品久久久久久变态 | 91精品无人成人www | 久久综合九色综合久99 | 久久国产电影院 | 六月久久婷婷 | 日韩av区 | 九九免费精品视频 | 激情视频综合网 | 欧美精品亚洲二区 | 懂色av懂色av粉嫩av分享吧 | 亚欧日韩成人h片 | 婷婷av综合 | 欧美a级免费视频 | 久久伊人热 | 久久综合成人网 | 菠萝菠萝在线精品视频 | 99久久精品免费看国产免费软件 | 亚洲午夜大片 | 91亚州| 色综合久 | 日韩精品免费专区 | 日韩在线观看一区二区三区 | 国产色在线,com | 欧亚日韩精品一区二区在线 | 精品国产乱码久久久久久1区2匹 | 色播99 | 蜜桃av人人夜夜澡人人爽 | 国产区在线| 色综合久久中文综合久久牛 | 亚洲精品资源在线观看 | 久久高清毛片 | 免费国产黄线在线观看视频 | 亚洲精品videossex少妇 | 日韩激情小视频 | 久久99精品国产麻豆宅宅 | 草久在线| 最新国产在线 | 在线观看黄 | 不卡视频国产 | 不卡的av在线 | 天天曰视频 | 狠狠操导航| 久久神马影院 | 国产中文在线播放 | 亚洲精品网址在线观看 | 麻豆精品视频在线观看免费 | 免费视频a | 久精品在线观看 | 国产一区二区三区午夜 | 99久久精品无码一区二区毛片 | 91网页版在线观看 | 国产精品理论片在线播放 | 视频一区在线播放 | 天天干夜夜爱 | 黄色精品免费 | 免费在线播放av电影 | 999久久久久久久久久久 | 九九激情视频 | 激情五月视频 | 91亚洲永久精品 | 国产一区二区在线观看免费 | 久草视频在线新免费 | 日批视频在线观看免费 | 久久久综合香蕉尹人综合网 | 久久免费看视频 | 亚洲午夜久久久久久久久 | 成人a视频片观看免费 | 日本成人免费在线观看 | 久久99精品国产99久久 | 欧美日韩一区二区免费在线观看 | 久久久久久久久久久久久国产精品 | 福利一区二区 | 成年人免费在线观看网站 | 国产精品专区在线观看 | 午夜少妇| 99久免费精品视频在线观看 | 色婷婷国产精品一区在线观看 | 四虎国产精品成人免费影视 | 国产露脸91国语对白 | 精品1区二区| 精品在线观看一区二区三区 | 久久久久免费精品视频 | 国产精品视频 | 亚洲成人网在线 | 日韩黄色av网站 | av中文字幕av| 久久字幕精品一区 | 天天操天天操一操 | 久久男人影院 | 又黄又爽又色无遮挡免费 | 91亚洲视频在线观看 | 天天操夜夜摸 | 涩涩资源网 | 欧美污网站 | 亚洲精品播放 | 国产精品a久久久久 | 人成在线免费视频 | 久久精品一区二区三区中文字幕 | 欧美另类交在线观看 | 亚洲视频h | 一区二区三区视频 | 亚洲欧洲精品久久 | 国产小视频网站 | 欧美在线观看禁18 | 欧美日韩国产区 | 色偷偷网站视频 | 色99视频 | 国产精品成人aaaaa网站 | 亚洲欧洲精品在线 | 人人澡人人澡人人 | 色综合天天干 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 最近中文字幕免费视频 | 456免费视频 | 久久av网 | 婷婷综合成人 | 波多野结衣一区二区 | 69视频网站 | 狠狠色狠狠色综合日日小说 | 日韩在线不卡视频 | 久久久精品一区二区 | 中文字幕精品在线 | 香蕉影院在线 | 成人av一区二区三区 | 欧美十八 | 久久日本视频 | 亚洲黄色激情小说 | 91免费看黄色 | 日本中文字幕网站 | 国产视频一区在线免费观看 | 亚洲综合色婷婷 | 81国产精品久久久久久久久久 | 国产免费人成xvideos视频 | 久久九九精品久久 | 国产亚洲欧美精品久久久久久 | 最新日韩在线观看视频 | 久久理论电影 | 99久久精品久久久久久清纯 | 国产96av| av中文字幕日韩 | www日韩在线 | 九九精品毛片 | 日韩美女高潮 | 精品视频国产 | 国产中文字幕国产 | 国产精品免费麻豆入口 | av中文字幕剧情 | 国产亚洲精品久久19p | 精品久久久久久综合 | 成人在线视 | 国产视频一区在线免费观看 | 九九免费精品 | 激情婷婷欧美 | 91成人欧美 | 五月天开心 | 日本在线成人 | 免费99精品国产自在在线 | 91久久在线观看 | 久草在线官网 | 国产剧情一区二区 | 99精品免费久久久久久久久日本 | 成人黄色免费观看 | 欧美日韩一区二区在线观看 | 热精品 | 成人视屏免费看 | 亚洲电影网站 | 91成人免费电影 | 欧美另类色图 | 久久精品视频在线看 | 欧美日韩视频精品 | 夜夜摸夜夜爽 | 日本精品二区 | 在线不卡中文字幕播放 | 天天综合成人 | 亚洲一区 影院 | 亚洲a资源|