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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

枚举枚举和修改“最终静态”字段的方法

發布時間:2023/12/3 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 枚举枚举和修改“最终静态”字段的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在本新聞通訊中,該新聞通訊最初發表在Java專家的新聞通訊第161期中,我們研究了如何使用sun.reflect包中的反射類在Sun JDK中創建枚舉實例。 顯然,這僅適用于Sun的JDK。 如果需要在另一個JVM上執行此操作,則您可以自己完成。

這一切都始于愛丁堡的肯·多布森(Ken Dobson)的一封電子郵件,該電子郵件向我指出了sun.reflect.ConstructorAccessor的方向,他聲稱可以將其用于構造枚舉實例。 我以前的方法(通訊#141)在Java 6中不起作用。

我很好奇為什么Ken要構造枚舉。 這是他想使用它的方式:

public enum HumanState {HAPPY, SAD }public class Human {public void sing(HumanState state) {switch (state) {case HAPPY:singHappySong();break;case SAD:singDirge();break;default:new IllegalStateException("Invalid State: " + state);}}private void singHappySong() {System.out.println("When you're happy and you know it ...");}private void singDirge() {System.out.println("Don't cry for me Argentina, ...");} }

上面的代碼需要進行單元測試。 你發現錯誤了嗎? 如果沒有,請使用細梳再次遍歷代碼以嘗試找到它。 當我第一次看到這個時,我也沒有發現錯誤。

當我們產生這樣的錯誤時,我們應該做的第一件事就是進行顯示該錯誤的單元測試。 但是,在這種情況下,我們無法使default情況發生,因為HumanState僅具有HAPPY和SAD枚舉。

Ken的發現使我們可以使用sun.reflect包中的ConstructorAccessor類來創建枚舉的實例。 它涉及到以下內容:

Constructor cstr = clazz.getDeclaredConstructor(String.class, int.class ); ReflectionFactory reflection =ReflectionFactory.getReflectionFactory(); Enum e =reflection.newConstructorAccessor(cstr).newInstance("BLA",3);

但是,如果僅執行此操作,則最終會出現ArrayIndexOutOfBoundsException,當我們看到Java編譯器如何將switch語句轉換為字節代碼時,這才有意義。 以上面的Human類為例,反編譯后的代碼如下所示(感謝Pavel Kouznetsov的JAD ):

public class Human {public void sing(HumanState state) {static class _cls1 {static final int $SwitchMap$HumanState[] =new int[HumanState.values().length];static {try {$SwitchMap$HumanState[HumanState.HAPPY.ordinal()] = 1;} catch(NoSuchFieldError ex) { }try {$SwitchMap$HumanState[HumanState.SAD.ordinal()] = 2;} catch(NoSuchFieldError ex) { }}}switch(_cls1.$SwitchMap$HumanState[state.ordinal()]) {case 1:singHappySong();break;case 2:singDirge();break;default:new IllegalStateException("Invalid State: " + state);break;}}private void singHappySong() {System.out.println("When you're happy and you know it ...");}private void singDirge() {System.out.println("Don't cry for me Argentina, ...");} }

您可以立即看到為什么要得到ArrayIndexOutOfBoundsException,這要歸功于內部類_cls1。

我第一次嘗試解決此問題并沒有得到一個不錯的解決方案。 我試圖在HumanState枚舉中修改$ VALUES數組。 但是,我只是擺脫了Java的保護性代碼。 您可以修改final字段 ,只要它們是非靜態的即可。 對我來說,這種限制似乎是人為的,因此我著手尋找靜態最終領域的圣杯。 再一次,它被藏在陽光反射的房間里。

設置“最終靜態”字段

設置final static字段需要幾件事。 首先,我們需要使用法線反射獲取Field對象。 如果將其傳遞給FieldAccessor,我們將退出安全代碼,因為我們正在處理靜態的final字段。 其次,我們將Field對象實例中的修飾符字段值更改為非最終值。 第三,將經過修改的字段傳遞給sun.reflect包中的FieldAccessor并使用它進行設置。

這是我的ReflectionHelper類,可用于通過反射設置final static字段:

import sun.reflect.*; import java.lang.reflect.*;public class ReflectionHelper {private static final String MODIFIERS_FIELD = "modifiers";private static final ReflectionFactory reflection =ReflectionFactory.getReflectionFactory();public static void setStaticFinalField(Field field, Object value)throws NoSuchFieldException, IllegalAccessException {// we mark the field to be publicfield.setAccessible(true);// next we change the modifier in the Field instance to// not be final anymore, thus tricking reflection into// letting us modify the static final fieldField modifiersField =Field.class.getDeclaredField(MODIFIERS_FIELD);modifiersField.setAccessible(true);int modifiers = modifiersField.getInt(field);// blank out the final bit in the modifiers intmodifiers &= ~Modifier.FINAL;modifiersField.setInt(field, modifiers);FieldAccessor fa = reflection.newFieldAccessor(field, false);fa.set(null, value);} }

通過使用ReflectionHelper,我可以在枚舉中設置$ VALUES數組以包含新的枚舉。 這行得通,只是我必須在首次加載Human類之前執行此操作。 這會將競爭條件引入我們的測試用例中。 單獨進行每個測試都可以,但是總的來說,它們可能會失敗。 不好的情況!

重新連接枚舉開關

下一個想法是重新連接實際的switch語句的$ SwitchMap $ HumanState字段。 在匿名內部類中找到該字段將相當容易。 您所需要的只是前綴$ SwitchMap $,后跟枚舉類名稱。 如果枚舉在一個類中切換了幾次,則內部類僅創建一次。

我昨天寫的其他解決方案之一檢查了我們的switch語句是否正在處理所有可能的情況。 將新類型引入系統后,這對于發現錯誤很有用。 我放棄了該特定解決方案,但是您應該能夠基于稍后將向您展示的EnumBuster重新創建該解決方案。

紀念品設計模式

我最近重新編寫了我的設計模式課程 (警告,該網站可能尚未建立最新的結構–請查詢更多信息),以考慮Java的變化,丟棄一些過時的模式并介紹我以前排除的一些。 “新”模式之一是Memento,通常與撤消功能一起使用。 我認為這是一個很好的模式,可以用來在我們努力測試不可能的案例的努力中消除對枚舉造成的損害。

出版專家通訊給我某些自由。 我不必解釋我寫的每一行。 因此,事不宜遲,這里是我的EnumBuster類,它使您可以創建枚舉,將它們添加到現有的values []中,從數組中刪除枚舉,同時維護您指定的任何類的switch語句。

import sun.reflect.*;import java.lang.reflect.*; import java.util.*;public class EnumBuster<E extends Enum<E>> {private static final Class[] EMPTY_CLASS_ARRAY =new Class[0];private static final Object[] EMPTY_OBJECT_ARRAY =new Object[0];private static final String VALUES_FIELD = "$VALUES";private static final String ORDINAL_FIELD = "ordinal";private final ReflectionFactory reflection =ReflectionFactory.getReflectionFactory();private final Class<E> clazz;private final Collection<Field> switchFields;private final Deque<Memento> undoStack =new LinkedList<Memento>();/*** Construct an EnumBuster for the given enum class and keep* the switch statements of the classes specified in* switchUsers in sync with the enum values.*/public EnumBuster(Class<E> clazz, Class... switchUsers) {try {this.clazz = clazz;switchFields = findRelatedSwitchFields(switchUsers);} catch (Exception e) {throw new IllegalArgumentException("Could not create the class", e);}}/*** Make a new enum instance, without adding it to the values* array and using the default ordinal of 0.*/public E make(String value) {return make(value, 0,EMPTY_CLASS_ARRAY, EMPTY_OBJECT_ARRAY);}/*** Make a new enum instance with the given ordinal.*/public E make(String value, int ordinal) {return make(value, ordinal,EMPTY_CLASS_ARRAY, EMPTY_OBJECT_ARRAY);}/*** Make a new enum instance with the given value, ordinal and* additional parameters. The additionalTypes is used to match* the constructor accurately.*/public E make(String value, int ordinal,Class[] additionalTypes, Object[] additional) {try {undoStack.push(new Memento());ConstructorAccessor ca = findConstructorAccessor(additionalTypes, clazz);return constructEnum(clazz, ca, value,ordinal, additional);} catch (Exception e) {throw new IllegalArgumentException("Could not create enum", e);}}/*** This method adds the given enum into the array* inside the enum class. If the enum already* contains that particular value, then the value* is overwritten with our enum. Otherwise it is* added at the end of the array.** In addition, if there is a constant field in the* enum class pointing to an enum with our value,* then we replace that with our enum instance.** The ordinal is either set to the existing position* or to the last value.** Warning: This should probably never be called,* since it can cause permanent changes to the enum* values. Use only in extreme conditions.** @param e the enum to add*/public void addByValue(E e) {try {undoStack.push(new Memento());Field valuesField = findValuesField();// we get the current Enum[]E[] values = values();for (int i = 0; i < values.length; i++) {E value = values[i];if (value.name().equals(e.name())) {setOrdinal(e, value.ordinal());values[i] = e;replaceConstant(e);return;}}// we did not find it in the existing array, thus// append it to the arrayE[] newValues =Arrays.copyOf(values, values.length + 1);newValues[newValues.length - 1] = e;ReflectionHelper.setStaticFinalField(valuesField, newValues);int ordinal = newValues.length - 1;setOrdinal(e, ordinal);addSwitchCase();} catch (Exception ex) {throw new IllegalArgumentException("Could not set the enum", ex);}}/*** We delete the enum from the values array and set the* constant pointer to null.** @param e the enum to delete from the type.* @return true if the enum was found and deleted;* false otherwise*/public boolean deleteByValue(E e) {if (e == null) throw new NullPointerException();try {undoStack.push(new Memento());// we get the current E[]E[] values = values();for (int i = 0; i < values.length; i++) {E value = values[i];if (value.name().equals(e.name())) {E[] newValues =Arrays.copyOf(values, values.length - 1);System.arraycopy(values, i + 1, newValues, i,values.length - i - 1);for (int j = i; j < newValues.length; j++) {setOrdinal(newValues[j], j);}Field valuesField = findValuesField();ReflectionHelper.setStaticFinalField(valuesField, newValues);removeSwitchCase(i);blankOutConstant(e);return true;}}} catch (Exception ex) {throw new IllegalArgumentException("Could not set the enum", ex);}return false;}/*** Undo the state right back to the beginning when the* EnumBuster was created.*/public void restore() {while (undo()) {//}}/*** Undo the previous operation.*/public boolean undo() {try {Memento memento = undoStack.poll();if (memento == null) return false;memento.undo();return true;} catch (Exception e) {throw new IllegalStateException("Could not undo", e);}}private ConstructorAccessor findConstructorAccessor(Class[] additionalParameterTypes,Class<E> clazz) throws NoSuchMethodException {Class[] parameterTypes =new Class[additionalParameterTypes.length + 2];parameterTypes[0] = String.class;parameterTypes[1] = int.class;System.arraycopy(additionalParameterTypes, 0,parameterTypes, 2,additionalParameterTypes.length);Constructor<E> cstr = clazz.getDeclaredConstructor(parameterTypes);return reflection.newConstructorAccessor(cstr);}private E constructEnum(Class<E> clazz,ConstructorAccessor ca,String value, int ordinal,Object[] additional)throws Exception {Object[] parms = new Object[additional.length + 2];parms[0] = value;parms[1] = ordinal;System.arraycopy(additional, 0, parms, 2, additional.length);return clazz.cast(ca.newInstance(parms));}/*** The only time we ever add a new enum is at the end.* Thus all we need to do is expand the switch map arrays* by one empty slot.*/private void addSwitchCase() {try {for (Field switchField : switchFields) {int[] switches = (int[]) switchField.get(null);switches = Arrays.copyOf(switches, switches.length + 1);ReflectionHelper.setStaticFinalField(switchField, switches);}} catch (Exception e) {throw new IllegalArgumentException("Could not fix switch", e);}}private void replaceConstant(E e)throws IllegalAccessException, NoSuchFieldException {Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {if (field.getName().equals(e.name())) {ReflectionHelper.setStaticFinalField(field, e);}}}private void blankOutConstant(E e)throws IllegalAccessException, NoSuchFieldException {Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {if (field.getName().equals(e.name())) {ReflectionHelper.setStaticFinalField(field, null);}}}private void setOrdinal(E e, int ordinal)throws NoSuchFieldException, IllegalAccessException {Field ordinalField = Enum.class.getDeclaredField(ORDINAL_FIELD);ordinalField.setAccessible(true);ordinalField.set(e, ordinal);}/*** Method to find the values field, set it to be accessible,* and return it.** @return the values array field for the enum.* @throws NoSuchFieldException if the field could not be found*/private Field findValuesField()throws NoSuchFieldException {// first we find the static final array that holds// the values in the enum classField valuesField = clazz.getDeclaredField(VALUES_FIELD);// we mark it to be publicvaluesField.setAccessible(true);return valuesField;}private Collection<Field> findRelatedSwitchFields(Class[] switchUsers) {Collection<Field> result = new ArrayList<Field>();try {for (Class switchUser : switchUsers) {Class[] clazzes = switchUser.getDeclaredClasses();for (Class suspect : clazzes) {Field[] fields = suspect.getDeclaredFields();for (Field field : fields) {if (field.getName().startsWith("$SwitchMap$" +clazz.getSimpleName())) {field.setAccessible(true);result.add(field);}}}}} catch (Exception e) {throw new IllegalArgumentException("Could not fix switch", e);}return result;}private void removeSwitchCase(int ordinal) {try {for (Field switchField : switchFields) {int[] switches = (int[]) switchField.get(null);int[] newSwitches = Arrays.copyOf(switches, switches.length - 1);System.arraycopy(switches, ordinal + 1, newSwitches,ordinal, switches.length - ordinal - 1);ReflectionHelper.setStaticFinalField(switchField, newSwitches);}} catch (Exception e) {throw new IllegalArgumentException("Could not fix switch", e);}}@SuppressWarnings("unchecked")private E[] values()throws NoSuchFieldException, IllegalAccessException {Field valuesField = findValuesField();return (E[]) valuesField.get(null);}private class Memento {private final E[] values;private final Map<Field, int[]> savedSwitchFieldValues =new HashMap<Field, int[]>();private Memento() throws IllegalAccessException {try {values = values().clone();for (Field switchField : switchFields) {int[] switchArray = (int[]) switchField.get(null);savedSwitchFieldValues.put(switchField,switchArray.clone());}} catch (Exception e) {throw new IllegalArgumentException("Could not create the class", e);}}private void undo() throwsNoSuchFieldException, IllegalAccessException {Field valuesField = findValuesField();ReflectionHelper.setStaticFinalField(valuesField, values);for (int i = 0; i < values.length; i++) {setOrdinal(values[i], i);}// reset all of the constants defined inside the enumMap<String, E> valuesMap =new HashMap<String, E>();for (E e : values) {valuesMap.put(e.name(), e);}Field[] constantEnumFields = clazz.getDeclaredFields();for (Field constantEnumField : constantEnumFields) {E en = valuesMap.get(constantEnumField.getName());if (en != null) {ReflectionHelper.setStaticFinalField(constantEnumField, en);}}for (Map.Entry<Field, int[]> entry :savedSwitchFieldValues.entrySet()) {Field field = entry.getKey();int[] mappings = entry.getValue();ReflectionHelper.setStaticFinalField(field, mappings);}}} }

該類很長,可能仍然存在一些錯誤。 我是從舊金山到紐約的途中寫的。 這是我們可以使用它來測試人類課程的方法:

import junit.framework.TestCase;public class HumanTest extends TestCase {public void testSingingAddingEnum() {EnumBuster<HumanState> buster =new EnumBuster<HumanState>(HumanState.class,Human.class);try {Human heinz = new Human();heinz.sing(HumanState.HAPPY);heinz.sing(HumanState.SAD);HumanState MELLOW = buster.make("MELLOW");buster.addByValue(MELLOW);System.out.println(Arrays.toString(HumanState.values()));try {heinz.sing(MELLOW);fail("Should have caused an IllegalStateException");}catch (IllegalStateException success) { }}finally {System.out.println("Restoring HumanState");buster.restore();System.out.println(Arrays.toString(HumanState.values()));}} }

現在,此單元測試在前面顯示的Human.java文件中顯示了錯誤。 我們忘記添加throw關鍵字!

When you're happy and you know it ... Don't cry for me Argentina, ... [HAPPY, SAD, MELLOW] Restoring HumanState [HAPPY, SAD]AssertionFailedError: Should have caused an IllegalStateExceptionat HumanTest.testSingingAddingEnum(HumanTest.java:23)

EnumBuster類可以做的更多。 我們可以使用它來刪除不需要的枚舉。 如果我們指定switch語句是哪個類,則將同時維護這些類。 另外,我們可以還原到初始狀態。 很多功能!

我注銷之前的最后一個測試用例,我們將測試類添加到switch類中以進行維護。

import junit.framework.TestCase;public class EnumSwitchTest extends TestCase {public void testSingingDeletingEnum() {EnumBuster<HumanState> buster =new EnumBuster<HumanState>(HumanState.class,EnumSwitchTest.class);try {for (HumanState state : HumanState.values()) {switch (state) {case HAPPY:case SAD:break;default:fail("Unknown state");}}buster.deleteByValue(HumanState.HAPPY);for (HumanState state : HumanState.values()) {switch (state) {case SAD:break;case HAPPY:default:fail("Unknown state");}}buster.undo();buster.deleteByValue(HumanState.SAD);for (HumanState state : HumanState.values()) {switch (state) {case HAPPY:break;case SAD:default:fail("Unknown state");}}buster.deleteByValue(HumanState.HAPPY);for (HumanState state : HumanState.values()) {switch (state) {case HAPPY:case SAD:default:fail("Unknown state");}}} finally {buster.restore();}} }

EnumBuster甚至保留常量,因此,如果從values()中刪除一個枚舉,它將清空最終的靜態字段。 如果重新添加,它將設置為新值。

肯·多布森(Ken Dobson)的想法以一種我不知道有可能的方式進行反思,真是令人愉悅。 (任何Sun工程師都讀過這篇文章,請不要在Java的未來版本中插入這些漏洞!)

親切的問候

亨氏

JavaSpecialists在您公司內提供所有課程。 更多信息 …
請務必閱讀我們有關Java并發性的新課程。 請與我聯系以獲取更多信息。

關于Heinz M.Kabutz博士

自2000年以來,我一直在為Java專家社區寫作。這很有趣。 當您與可能會喜歡的人分享這本書時,這會更加有趣。 如果他們前往www.javaspecialists.eu并將自己添加到列表中,則他們可以每個月獲得新鮮的東西。

中繼:這篇文章是Java Advent Calendar的一部分,并根據Creative Commons 3.0 Attribution許可獲得許可。 如果您喜歡它,請通過共享,發推,FB,G +等來傳播信息! 想為博客寫文章嗎? 我們正在尋找能夠填補所有24個職位的貢獻者,并希望能為您貢獻力量! 聯系Attila Balazs貢獻力量!

參考資料:來自Java日歷日歷博客的JCG合作伙伴 Attila-Mihaly Balazs的“枚舉枚舉和修改”最終靜態”字段 。

翻譯自: https://www.javacodegeeks.com/2012/12/of-hacking-enums-and-modifying-final-static-fields.html

總結

以上是生活随笔為你收集整理的枚举枚举和修改“最终静态”字段的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

成人免费在线电影 | 久久久久久久久久久久99 | 国产精品一区二区在线 | 日韩色在线 | 永久免费毛片在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 四虎影视精品 | 青春草视频 | 色99在线| 视频在线一区二区三区 | 国产免费大片 | 美国三级黄色大片 | 国产亲近乱来精品 | 久久观看最新视频 | 色妞色视频一区二区三区四区 | 国产精品福利在线 | 极品美女被弄高潮视频网站 | 992tv人人网tv亚洲精品 | 国产日韩欧美在线观看 | 国产日韩视频在线播放 | 超碰免费成人 | av大全在线播放 | 97网| av一区在线播放 | 97色se | 免费观看一级成人毛片 | 99久久婷婷国产综合精品 | 麻豆系列在线观看 | 亚洲最大av | 国产人成在线视频 | 婷婷深爱五月 | 一区二区三区中文字幕在线 | 日韩精品在线视频免费观看 | 日韩久久午夜一级啪啪 | 国产二区免费视频 | 欧美视频二区 | 精品国产人成亚洲区 | 国产午夜精品理论片在线 | 日日干网| 日韩电影中文 | 91在线最新 | 成人av播放| 亚洲精品国产视频 | 99欧美视频 | 国产精品久久久999 国产91九色视频 | 99综合视频 | 97国产视频 | 欧美日韩视频在线播放 | 久久国产一区 | 国产精品成人久久久 | 福利视频一区二区 | 免费日韩av片| 亚洲码国产日韩欧美高潮在线播放 | 久久av高清 | 日韩在线观看第一页 | 欧美片网站yy | 黄色毛片观看 | 国产精品久久久久久久久久久久久久 | 久久免费看a级毛毛片 | 97碰碰视频| 99电影 | 99久久www | 精品在线不卡 | 亚洲在线网址 | 久草在线一免费新视频 | 久久久2o19精品 | 91黄色小网站 | 精品亚洲免费 | 中文字幕专区高清在线观看 | 国产黄色在线观看 | 午夜视频一区二区三区 | 久久日韩精品 | 成人小视频免费在线观看 | 亚洲欧美va| 天天操天天吃 | 国内精品久久久久影院日本资源 | 日韩一级片观看 | 色婷婷五 | 97视频在线观看成人 | 欧美在线18 | 久久99久久久久久 | 人人爽人人乐 | 毛片3 | 福利久久久 | 免费在线观看视频一区 | 97碰碰精品嫩模在线播放 | 美女久久久久 | 欧美少妇xx | 婷婷综合导航 | 激情综合站| 99精品亚洲 | 国产精品理论片在线播放 | 日韩精品高清不卡 | 免费在线观看午夜视频 | 国产精品亚洲片在线播放 | 99国产在线视频 | 欧美一区二区在线 | 国产精品高潮呻吟久久av无 | 精品久久久国产 | 91综合久久一区二区 | 国产成人久久av | 91亚洲精品久久久蜜桃网站 | 国产精品久久久久久久久久了 | 精品国产一区二区三区久久 | 视频一区二区国产 | 91av蜜桃| 国产成人精品一区二区三区在线观看 | 成人亚洲精品久久久久 | 成人午夜av电影 | 国产精品久久久久9999吃药 | 久久天| 中文区中文字幕免费看 | av免费观看网站 | 国产精品一区二区久久久 | 国产日本亚洲高清 | 一区二区三区四区在线免费观看 | 免费看国产a| 亚洲天堂网在线播放 | 国产专区视频在线 | 亚洲视频 视频在线 | 国产高清视频免费最新在线 | 国产伦理一区 | 一区 二区电影免费在线观看 | 国产看片免费 | a级一a一级在线观看 | 亚洲欧洲精品久久 | 中文字幕一区二区三区久久蜜桃 | 男女拍拍免费视频 | 人人涩 | 精品久久视频 | 黄色资源网站 | 国产精品一区二区在线观看免费 | 在线观看国产v片 | 粉嫩aⅴ一区二区三区 | 国产一级片网站 | 97在线看| 91亚州| 亚洲黄色a| 国产理论一区二区三区 | 久草在线免费资源站 | 三级黄色三级 | 91aaa在线观看 | 午夜私人影院久久久久 | 黄色三级在线观看 | 中文字幕精品www乱入免费视频 | 三级毛片视频 | 国产明星视频三级a三级点| 久草视频在线看 | 亚洲精品成人av在线 | 久草在线资源观看 | 激情综合中文娱乐网 | 国产精品原创av片国产免费 | 欧美成人日韩 | 国产午夜精品久久久久久久久久 | 久久激情久久 | 激情久久一区二区三区 | 久久综合久久久 | 国产精品99久久久久久武松影视 | a视频免费看 | 久久久久国产精品www | 99精品视频一区 | 天天干天天操天天射 | 久久九九影视网 | 婷婷色中文网 | 在线观看视频黄 | 91精品在线免费视频 | 日韩av免费一区 | 丁香久久婷婷 | 狠狠干2018 | 日b视频国产 | 亚洲电影一级黄 | 中文在线www| 在线免费国产视频 | 国产精品亚洲成人 | 91精品国产自产91精品 | 最近中文字幕高清字幕在线视频 | 日韩毛片一区 | 久久久久久久久久久免费av | 美女视频黄频 | 国产一性一爱一乱一交 | 1区2区视频| 久久久久国产精品www | 色老板在线| 91精品国产自产在线观看 | 色婷av | 麻豆精品国产传媒 | 天天干天天做天天操 | 国产精品99在线播放 | 不卡电影免费在线播放一区 | 亚洲六月丁香色婷婷综合久久 | 日日干夜夜干 | 99精品久久99久久久久 | 国产成年免费视频 | 午夜 免费 | 国产精品 欧美 日韩 | 亚洲天天草 | 永久黄网站色视频免费观看w | 欧美日韩精品免费观看 | 久久久久亚洲精品男人的天堂 | 视频在线一区二区三区 | 日本亚洲国产 | 国产精品毛片久久久久久久 | 国产免费高清 | 99精品欧美一区二区蜜桃免费 | 麻豆视频国产精品 | 国产精品18久久久久久久久 | 国产高清在线免费视频 | 国产精品久久久久久久7电影 | 91免费网站在线观看 | 国产91影院 | 久久国产欧美日韩精品 | 99精品在线视频播放 | a级片在线播放 | 在线亚洲成人 | 肉色欧美久久久久久久免费看 | 麻豆首页 | 中文字幕在线影院 | 中文字幕一区二区三区四区视频 | 免费涩涩网站 | 一级理论片在线观看 | 国产玖玖在线 | 日日草天天干 | 国产亚洲精品久久久久久移动网络 | 美女黄频免费 | 国产在线观看高清视频 | 久久久免费 | 国产伦精品一区二区三区在线 | 亚洲在线视频播放 | 婷色在线 | 亚洲网站在线 | 99精品视频在线观看免费 | 久久精品视频中文字幕 | 欧美做受高潮电影o | 亚洲精品视频www | 久久久免费网站 | 天天干天天操天天射 | 性色av免费看 | av片无限看| 欧美性脚交 | 国内成人精品2018免费看 | 亚洲综合射 | 97精品国产aⅴ | 国产精美视频 | 韩日成人av | 91精品秘密在线观看 | 亚洲一区日韩精品 | 天天干天天拍天天操天天拍 | 久久久国产精品免费 | 日韩特级黄色片 | 国产日韩精品视频 | 九九热在线观看 | 国产高清精 | 黄色小说在线免费观看 | 久久精品视频3 | 91香蕉视频在线下载 | 欧洲精品久久久久毛片完整版 | 日韩午夜剧场 | 91超级碰碰 | 国产福利一区二区三区在线观看 | 婷婷亚洲最大 | 国产精品系列在线 | 亚洲毛片一区二区三区 | 亚洲久草网 | 97在线观看免费观看高清 | 日韩免费在线视频观看 | 91久久久久久久 | 国产探花在线看 | 欧美精品在线观看一区 | 欧美孕妇与黑人孕交 | 黄色大全免费网站 | 欧美一区二视频在线免费观看 | 超碰九九 | 成人a视频片观看免费 | 911精品美国片911久久久 | 天天操天天射天天插 | 五月天久久婷婷 | 96av在线视频 | 黄色网www | 天天射一射 | 中文字幕视频在线播放 | 六月色 | 国产精品久久久久久久7电影 | 91亚洲欧美 | 国产亚洲视频中文字幕视频 | 午夜影院日本 | 国产在线小视频 | 国产精品日韩精品 | 丁香六月激情婷婷 | 九九久久国产 | 2023天天干 | 久草在线久草在线2 | 又黄又爽又色无遮挡免费 | 国产精品乱码高清在线看 | 久久久久久高潮国产精品视 | www亚洲精品 | 成人av在线一区二区 | 综合久色 | 免费看一级特黄a大片 | 亚洲国产欧美在线看片xxoo | 久香蕉| 欧美午夜精品久久久久久浪潮 | 色婷婷婷 | 中文字幕av一区二区三区四区 | 草久久久 | www.五月婷| 久久免费播放视频 | 欧美在线视频第一页 | 成人国产精品 | 99久久精品国产系列 | 午夜电影一区 | 一区二区三区四区免费视频 | 麻豆传媒视频在线免费观看 | 一级片视频免费观看 | 免费人成在线观看网站 | 九九色网| 亚洲一区二区三区在线看 | 精品国产区 | 欧美国产日韩激情 | 国产精品亚 | 免费看黄色小说的网站 | 在线有码中文 | 97av影院 | 天天插狠狠干 | av不卡免费看 | 91丨九色丨国产女 | 97香蕉超级碰碰久久免费软件 | 日本精品在线看 | 天天操天天操天天操天天操天天操 | 500部大龄熟乱视频 欧美日本三级 | 亚洲精选99| 成人影视片 | 久久色网站 | 日本久久久久 | 欧美大片在线观看一区 | 亚洲免费视频在线观看 | 久久久精品国产一区二区电影四季 | 中文字幕日韩无 | 国产1区在线 | 国产网站色 | 久久久www| 99久久久久免费精品国产 | 国产精品一区二区在线免费观看 | 日韩高清一区在线 | 精品国产一区二区三区男人吃奶 | 在线91色| 亚洲欧美一区二区三区孕妇写真 | 欧美激情视频久久 | 夜夜操网 | 免费看污在线观看 | 婷婷色在线 | 免费在线观看av电影 | 成人在线视频免费看 | 国产精品第2页 | 五月婷婷一级片 | 一区二区精品久久 | 99久久999久久久精玫瑰 | 日韩精品亚洲专区在线观看 | 国产1区2区3区精品美女 | 毛片随便看 | 久久激情综合网 | 中文欧美字幕免费 | 久草网在线视频 | 人人爽人人干 | 91精品福利在线 | 久要激情网 | 欧美在线观看视频 | 亚洲 欧美 国产 va在线影院 | 黄色片网站av | 在线观看视频精品 | 中文字幕亚洲精品日韩 | 久久免费视屏 | 久久综合中文字幕 | 国产偷国产偷亚洲清高 | 国产精品入口久久 | 日韩三级不卡 | 国内精品免费 | 91黄色在线看 | 在线视频久 | 亚洲最大在线视频 | 欧美九九视频 | 午夜性生活片 | 毛片激情永久免费 | 久久视频6 | 毛片区 | 国产成人精品999在线观看 | 狠狠网亚洲精品 | 国产亚洲综合在线 | 在线国产高清 | 国产精品永久免费观看 | 欧美一区免费观看 | 最近高清中文字幕 | 亚洲另类xxxx | 一二区av| 国产手机视频在线播放 | 国产精品午夜在线观看 | 精产嫩模国品一二三区 | 精品超碰 | 99精品黄色 | 国内精自线一二区永久 | 九九精品视频在线观看 | 亚洲午夜久久久综合37日本 | 日p视频在线观看 | 精品美女在线观看 | 欧美激情第十页 | 综合精品久久久 | 黄色免费网站下载 | 亚洲色图 校园春色 | 人人干人人搞 | 国产69熟| 国产视频99| 国产首页 | 免费看片网址 | 亚洲国产合集 | 91看片成人 | 97精品国产97久久久久久粉红 | 亚洲区精品视频 | 日本最新一区二区三区 | 精品久久中文 | 伊色综合久久之综合久久 | 亚洲国产中文字幕在线观看 | 久久精品直播 | 视频在线观看入口黄最新永久免费国产 | 最新一区二区三区 | 三级免费黄 | 久久99国产一区二区三区 | 人人澡人人添人人爽一区二区 | 免费在线观看av网站 | 日本久久不卡视频 | 久久久久久久久久亚洲精品 | 亚洲黄在线观看 | 在线观看一区二区视频 | 九九九视频在线 | 午夜精品视频免费在线观看 | 五月天激情视频 | 成人黄大片视频在线观看 | 在线观av| 国内精品在线看 | 亚洲精品白浆高清久久久久久 | 久久国产精品久久w女人spa | 欧美成人xxxx| 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 不卡av在线 | 久久精品国产免费 | 免费久久久 | 激情五月综合网 | 日韩网站在线播放 | 91福利视频免费 | 日本视频网 | 天天爽天天爽天天爽 | 成人高清av在线 | 国产偷v国产偷∨精品视频 在线草 | 国产黄色片久久久 | 日日夜夜中文字幕 | 成年一级片 | 91视频免费网站 | 深爱婷婷激情 | 全黄色一级片 | 在线视频婷婷 | 偷拍精品一区二区三区 | 天天插狠狠插 | 欧美激情视频免费看 | 亚洲aⅴ久久精品 | 久草网站 | 欧美天堂视频在线 | 99久久精品免费看国产麻豆 | 五月婷婷中文字幕 | 97精品视频在线 | 伊人五月在线 | 欧美在线视频a | 国产日韩欧美在线影视 | 97精品国产97久久久久久免费 | 免费视频一区 | 色夜视频 | 337p欧美 | 国产综合片 | 九热在线 | 久久久久久久国产精品影院 | 国产日产欧美在线观看 | 亚洲 综合 国产 精品 | 亚洲一区免费在线 | 成人午夜精品福利免费 | 久草剧场 | 国产美女主播精品一区二区三区 | 成人免费在线观看av | 国产麻豆精品久久一二三 | 久草视频免费播放 | 国产成人在线观看 | 在线免费试看 | 激情五月婷婷丁香 | www色,com| 久久蜜臀一区二区三区av | 97超碰在线久草超碰在线观看 | 成人中心免费视频 | 天天天天色射综合 | 精品一区精品二区 | 久久精品99国产国产 | 一区二区伦理电影 | 色婷婷婷| 成人黄视频| 日日干综合 | 在线观看av免费 | 激情五月婷婷综合网 | 天天色官网 | 久久国产精品久久久久 | 久久久国产精品网站 | 日韩有码欧美 | 97成人免费视频 | 国产精品美女久久久久久久久 | 99精品免费在线 | 91传媒免费在线观看 | 亚洲精品国精品久久99热一 | 欧美日韩在线免费视频 | 久草在线视频网 | 九九免费在线观看 | 国产一及片 | 亚洲免费视频在线观看 | 九九热国产视频 | 国产精品成人国产乱 | 国产精品福利无圣光在线一区 | 日本黄色大片免费 | 奇米影视999 | 国产亚洲精品久久久久久大师 | 国产高清免费av | 婷婷色在线观看 | 99色国产| 黄色中文字幕 | 黄污在线看 | 国产一级大片免费看 | 草免费视频 | 91资源在线免费观看 | 亚洲麻豆精品 | 丁香花五月 | 天天操天天草 | 国产精品一区二区视频 | 97成人超碰 | 在线视频你懂得 | 免费看污片 | 青青久草在线视频 | 国内精品久久久久影院日本资源 | 4438全国亚洲精品观看视频 | 亚洲精品国产片 | 五月天久久久久久 | 亚洲欧洲在线视频 | 人人dvd | 亚州视频在线 | 亚洲国产美女精品久久久久∴ | 精品亚洲男同gayvideo网站 | 国产原创中文在线 | 国产精品成人久久久久久久 | 91在线精品视频 | 欧洲成人免费 | 国产一区二区午夜 | 日韩中字在线观看 | 午夜神马福利 | 美女视频又黄又免费 | 久久不卡电影 | 精品久久久久国产免费第一页 | 丝袜美腿一区 | 丁香六月婷婷激情 | 国产视频中文字幕 | 欧美日韩精品在线观看 | 又黄又刺激的网站 | 97人人人人 | 欧美国产亚洲精品久久久8v | 中文国产成人精品久久一 | 午夜精品久久久久99热app | 97爱| 亚洲精品欧美视频 | 黄色网址国产 | 在线免费看黄色 | 国产一区二区三区免费在线观看 | 午夜精品一区二区三区免费 | 精品久久久久免费极品大片 | 五月天激情综合 | 在线观看日本高清mv视频 | 日韩在线视 | 热久在线 | 黄色大片入口 | 一区二区中文字幕在线 | 蜜臀aⅴ国产精品久久久国产 | 国产手机视频在线 | 欧美不卡视频在线 | 免费婷婷| 在线观看岛国片 | 九九综合在线 | 国产不卡精品 | 国产精品久久久久久超碰 | www蜜桃视频 | 久久综合一本 | 久久日本视频 | 青青草国产在线 | 国内成人综合 | 国产手机在线精品 | 久久久久久久久久久精 | 久久夜色精品国产欧美乱极品 | 亚洲aⅴ一区二区三区 | 久香蕉 | 夜夜操综合网 | 免费又黄又爽的视频 | 国产不卡视频在线播放 | 精品国产成人在线影院 | 国产麻豆视频网站 | 中文字幕在线观看网 | 国产精品久久久久久吹潮天美传媒 | 免费看一级一片 | 美国av片在线观看 | 91精品国产高清自在线观看 | 国产一区二区在线播放视频 | av电影 一区二区 | 欧美综合在线视频 | 久久精品视频在线免费观看 | 国产高清一区二区 | 激情综合网在线观看 | 中文字幕国产精品一区二区 | 97色在线视频 | 欧美国产日韩在线视频 | 中文乱幕日产无线码1区 | av 一区 二区 久久 | 91av手机在线 | 欧美日韩在线视频免费 | 婷婷在线精品视频 | 91视频链接| 91爱看片| 中文字幕色站 | 99热这里只有精品1 av中文字幕日韩 | 波多野结衣网址 | 日韩国产在线观看 | 国产麻豆视频 | 欧美精品中文字幕亚洲专区 | 亚洲国产免费网站 | 天天综合网 天天综合色 | 美女视频是黄的免费观看 | 久久人人爽人人爽人人片av软件 | 999热视频 | 久久综合婷婷综合 | 99视频久 | 麻豆精品传媒视频 | 国产一级二级三级在线观看 | 99爱在线 | 中文字幕色播 | 成人久久18免费网站麻豆 | 日本成址在线观看 | 丁香花在线观看视频在线 | 欧美日韩一区久久 | 欧美另类网站 | 国产九九精品视频 | 日韩欧美国产激情在线播放 | 欧美性色综合网站 | 国产精品中文字幕av | 9992tv成人免费看片 | 日韩一级电影网站 | 色综合中文综合网 | 国产精品视频观看 | 91成人精品一区在线播放69 | 有码一区二区三区 | 成人黄色片免费 | 久久夜色网| 亚洲三级在线 | 国产精品久久久久久999 | 久久露脸国产精品 | 综合色中文 | 91免费试看 | 久久激五月天综合精品 | 91九色精品国产 | 人人看人人艹 | 午夜av日韩| 欧美黄色软件 | 91毛片在线观看 | 日韩午夜视频在线观看 | 亚洲精品理论片 | 亚洲一区二区三区精品在线观看 | 久久久久久久影视 | 国产高清免费 | 亚洲传媒在线 | 色资源网在线观看 | 91视频 - 114av | 中文永久免费观看 | 黄色av电影| 日日夜夜干 | 日韩高清在线一区 | 91chinese在线 | 四虎成人精品在永久免费 | 狠狠干综合网 | 亚洲一区二区精品 | 国产99久久久久久免费看 | 成人影视免费 | 欧美激情h | 精品国产观看 | 亚洲视频在线免费观看 | 欧美日韩在线视频观看 | 日韩精品最新在线观看 | 国产精品久久久久免费观看 | 国产精品女主播一区二区三区 | 国产麻豆视频在线观看 | 日本三级久久久 | 国产视频欧美视频 | 午夜影院日本 | 国产成人一二三 | 色综合久久88色综合天天免费 | 中文字幕在线乱 | 国产三级精品在线 | 粉嫩av一区二区三区四区 | 天天狠狠操 | 久久视了| 日日夜日日干 | 国产区网址 | 夜夜躁日日躁狠狠躁 | 中文字幕在线观看一区二区 | 国产精品原创在线 | 成人av中文字幕在线观看 | 日韩av进入| 国产精品美女久久久久久久久久久 | 国产专区日韩专区 | 日韩乱码在线 | 中文字幕在线观看日本 | 香蕉视频免费在线播放 | 一级黄色大片在线观看 | av在线免费观看黄 | 久久久久久精 | av中文字幕在线电影 | 精品视频999 | 99视频免费播放 | 在线成人免费电影 | 国产精品综合在线观看 | 国产精品中文字幕在线 | 91免费在线视频 | 97色视频在线 | 色av婷婷 | 中文字幕在线免费观看视频 | 缴情综合网五月天 | 欧美成年人在线视频 | 91av福利视频 | 国产精品欧美精品 | 久久精精品| 亚色视频在线观看 | 日韩精品中文字幕在线观看 | 亚洲波多野结衣 | 久久精品国产免费观看 | 成人h动漫精品一区二 | 97在线公开视频 | 97国产精品一区二区 | 中文字幕av一区二区三区四区 | 精品一区二区av | 中文字幕免费高清av | 99c视频在线 | 欧美日韩国产欧美 | av黄色影院 | 西西大胆啪啪 | 国产成人在线综合 | 一区二区三区www | 亚洲精品一区二区三区四区高清 | 99资源网 | 日韩精品视频久久 | 你操综合| 日韩在线免费视频 | 久久久官网 | av中文在线 | 亚洲另类久久 | 亚洲免费视频观看 | 99精品免费久久久久久久久 | 国产精品自产拍在线观看网站 | 国产成人精品综合 | 中文字幕黄色av | 欧美性生活免费看 | 免费的国产精品 | 欧美一区二区三区免费观看 | 中文字幕电影高清在线观看 | 一区二区不卡视频在线观看 | 日韩在线观看影院 | 欧美日韩精品在线观看 | 91在线91拍拍在线91 | 国产亚洲综合性久久久影院 | 久草综合在线 | 精品福利在线 | 人人擦 | 久久精品视频99 | 中文字幕有码在线播放 | 日韩av高清在线观看 | 国产日韩精品一区二区 | 免费男女羞羞的视频网站中文字幕 | 久久久久电影网站 | 亚洲高清视频一区二区三区 | 亚洲区精品 | 国产精品免费在线观看视频 | 久久久三级视频 | 亚洲美女在线国产 | 久久综合狠狠综合 | 狠狠色噜噜狠狠 | 欧美日一级片 | 91黄色在线视频 | 插久久 | 久久综合色8888 | 久久久久国产精品午夜一区 | 天天操天天草 | 日韩高清精品免费观看 | 五月婷婷伊人网 | 狠狠色丁香久久婷婷综合五月 | 天天操天天草 | 日韩最新av在线 | 免费看色视频 | 久久精品国产亚洲aⅴ | 手机在线免费av | h久久| 国产一卡二卡在线 | 91成人短视频在线观看 | 国产在线a不卡 | av看片在线 | 97人人视频| 日韩免费三区 | 天天躁日日 | 婷婷色5月| 99久久99热这里只有精品 | 欧美男男tv网站 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 天天操天天怕 | 五月综合网 | 国产在线观看地址 | 天堂在线一区二区三区 | 亚洲免费成人av电影 | 国产在线精品一区二区 | 亚洲精品自拍视频在线观看 | 日本黄区免费视频观看 | 免费看片日韩 | 毛片网站在线看 | 久久精品一二三区 | 美女免费电影 | 精品视频一区在线 | 狠狠的干 | 狠狠狠色丁香婷婷综合久久88 | 国产视频欧美视频 | 91久久久国产精品 | 五月激情在线 | 97人人澡人人爽人人模亚洲 | 91亚洲视频在线观看 | 最近中文字幕完整视频高清1 | 日本三级吹潮在线 | av在线免费播放 | 中文字幕在线观看视频网站 | 97视频在线免费 | 国产群p视频 | 天天干天天操天天拍 | 2019中文字幕第一页 | 国产精品久久久久四虎 | 最近中文字幕高清字幕免费mv | 久久国产精品一国产精品 | 婷婷六月在线 | www.大网伊人 | 国产资源网 | 国产精品久久免费看 | 亚洲免费资源 | 日韩午夜电影网 | 色视频网站免费观看 | 久久久.com| 久久久久久国产精品亚洲78 | 成人av资源网 | 二区在线播放 | 天天射天天做 | 欧美精品999 | 日韩极品在线 | 99久久婷婷国产精品综合 | 日本精品免费看 | 黄色一级大片在线免费看国产一 | 亚洲精品国偷拍自产在线观看蜜桃 | 在线观看国产亚洲 | 国产精品99久久免费黑人 | 中文字幕日韩在线播放 | 亚洲免费国产视频 | 婷婷久久网 | 国产精品成人久久 | 91精品国自产在线偷拍蜜桃 | 五月天婷亚洲天综合网鲁鲁鲁 | 91社区国产高清 | 日韩精品久久中文字幕 | 四虎在线观看精品视频 | 六月天综合网 | 天天操天天干天天操天天干 | 一区二区视频电影在线观看 | 激情久久网 | 国产精品一区二区在线观看免费 | 九色视频网址 | 97视频在线免费 | 亚洲男男gⅴgay双龙 | 日本最新高清不卡中文字幕 | 最近高清中文字幕 | 日韩黄色免费在线观看 | 久久深夜 | 久久精品官网 | av免费网| 日韩偷拍精品 | 欧美性精品 | 奇米四色影狠狠爱7777 | 色老板在线 | 在线看成人 | 国产乱码精品一区二区三区介绍 | 欧美极度另类性三渗透 | 1区2区视频 | 精品久久久成人 | 一区二区三区日韩精品 | 免费一级特黄毛大片 | 成人免费网站视频 | 热久久免费国产视频 | 久久久网页 | 亚洲欧洲精品久久 | 欧美激情第八页 | 国产三级av在线 | 亚洲闷骚少妇在线观看网站 | 91成人免费在线 | 国产在线一卡 | 国产99久 | 91视频啊啊啊| 我要色综合天天 | 丁香视频 | 日韩高清片 | 狠狠躁夜夜躁人人爽超碰97香蕉 | av激情五月| 亚洲精品资源在线 | 欧美精品少妇xxxxx喷水 | 人人爽人人乐 | 中文字幕亚洲欧美日韩2019 | 婷婷亚洲综合五月天小说 | 91激情视频在线观看 | 免费a v观看 | 五月天久久久久久 | 久二影院 | 亚洲一区二区高潮无套美女 | 色婷婷a| a级国产乱理论片在线观看 特级毛片在线观看 | 日韩欧美69 | 精品夜夜嗨av一区二区三区 | 69精品视频 | 视频直播国产精品 | 最近中文字幕完整高清 | 91在线在线观看 | av中文字幕免费在线观看 | 欧美精品久久久久a | 国产一级片在线播放 | 1024久久| 日韩精品专区在线影院重磅 | 中文字幕日本电影 | 欧美a√大片| 一区二区视频在线免费观看 | 91精品啪在线观看国产 | 日韩视频1区 | 黄色三级在线观看 | 日日操日日插 | 久久久国产精品人人片99精片欧美一 | 国产一级性生活视频 | 综合色中色 | 日韩丝袜视频 | 8x8x在线观看视频 | 五月天免费网站 | 黄污视频大全 | 国产一区二区三区黄 | 精品国产理论片 | 香蕉久久久久久av成人 | 亚洲日本精品 | 成人av电影免费在线播放 | 亚洲日本精品视频 | av成人免费在线 | 中中文字幕av | 国产午夜精品久久 | 九九九热 | a在线观看国产 | 亚洲精品中文字幕在线 | 欧美日韩高清在线一区 | 欧美国产不卡 | 亚洲精品久久久久中文字幕二区 | 激情综合网色播五月 | 九九九热精品免费视频观看网站 | 九热精品 | 亚洲精品激情 | 国产黄色特级片 | 国产最新在线视频 | 天天做天天爱天天综合网 | 91亚洲综合 | 高清免费在线视频 | 97人人模人人爽人人少妇 | 青草视频在线免费 | 狠狠色伊人亚洲综合网站野外 | 超级碰碰碰视频 | 国产日韩视频在线 | 亚洲欧美成人综合 | 激情五月播播久久久精品 | 激情五月av | 波多野结衣资源 | 91男人影院 | 国产午夜精品一区二区三区在线观看 | 西西444www大胆高清图片 | 久久艹久久 | 久久婷婷一区二区三区 | 精品国产99国产精品 | 国产呻吟在线 | 九九九热 | 91av成人 | 婷婷久久一区二区三区 | 久久免费电影网 | 人人舔人人插 | 99久久久久久久久 |