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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射及代理

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射及代理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、反射的概述和初體驗(yàn)

Reflection(反射)是被視為動(dòng)態(tài)語言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflection API取得任何類的內(nèi)部信息,并能直接操作任意對(duì)象的內(nèi)部屬性及方法。

  • 體會(huì)反射機(jī)制的“動(dòng)態(tài)性”
  • @Test public void test2(){for(int i = 0;i < 100;i++){int num = new Random().nextInt(3);//0,1,2String classPath = "";switch(num){case 0:classPath = "java.util.Date";break;case 1:classPath = "java.lang.Object";break;case 2:classPath = "com.atguigu.java.Person";break;}try {Object obj = getInstance(classPath);System.out.println(obj);} catch (Exception e) {e.printStackTrace();}} }/* 創(chuàng)建一個(gè)指定類的對(duì)象。 classPath:指定類的全類名*/ public Object getInstance(String classPath) throws Exception {Class clazz = Class.forName(classPath);return clazz.newInstance(); }
  • 反射機(jī)制能提供的功能
  • import org.junit.Test;import java.lang.annotation.ElementType; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** @author guizy* @create 2020 上午 10:38*/ public class ReflectionTest {//反射之前,對(duì)于Person的操作@Testpublic void test1() {//1.創(chuàng)建Person類的對(duì)象Person p1 = new Person("Tom", 12);//2.通過對(duì)象,調(diào)用其內(nèi)部的屬性、方法p1.age = 10;System.out.println(p1.toString());p1.show();//在Person類外部,不可以通過Person類的對(duì)象調(diào)用其內(nèi)部私有結(jié)構(gòu)。//比如:name、showNation()以及私有的構(gòu)造器}//反射之后,對(duì)于Person的操作@Testpublic void test2() throws Exception{Class clazz = Person.class;//1.通過反射,創(chuàng)建Person類的對(duì)象Constructor cons = clazz.getConstructor(String.class,int.class);Object obj = cons.newInstance("Tom", 12);Person p = (Person) obj;System.out.println(p.toString());//2.通過反射,調(diào)用對(duì)象指定的屬性、方法//調(diào)用屬性Field age = clazz.getDeclaredField("age");age.set(p,10);System.out.println(p.toString());//調(diào)用方法Method show = clazz.getDeclaredMethod("show");show.invoke(p);System.out.println("*******************************");//通過反射,可以調(diào)用Person類的私有結(jié)構(gòu)的。比如:私有的構(gòu)造器、方法、屬性//調(diào)用私有的構(gòu)造器Constructor cons1 = clazz.getDeclaredConstructor(String.class);cons1.setAccessible(true);Person p1 = (Person) cons1.newInstance("Jerry");System.out.println(p1);//調(diào)用私有的屬性Field name = clazz.getDeclaredField("name");name.setAccessible(true);name.set(p1,"HanMeimei");System.out.println(p1);//調(diào)用私有的方法Method showNation = clazz.getDeclaredMethod("showNation", String.class);showNation.setAccessible(true);String nation = (String) showNation.invoke(p1,"中國");//相當(dāng)于String nation = p1.showNation("中國")System.out.println(nation);}/*關(guān)于java.lang.Class類的理解1.類的加載過程:程序經(jīng)過javac.exe命令以后,會(huì)生成一個(gè)或多個(gè)字節(jié)碼文件(.class結(jié)尾)。接著我們使用java.exe命令對(duì)某個(gè)字節(jié)碼文件進(jìn)行解釋運(yùn)行。相當(dāng)于將某個(gè)字節(jié)碼文件加載到內(nèi)存中。此過程就稱為類的加載。加載到內(nèi)存中的類,我們就稱為運(yùn)行時(shí)類,此運(yùn)行時(shí)類,就作為Class的一個(gè)實(shí)例。2.換句話說,Class的實(shí)例就對(duì)應(yīng)著一個(gè)運(yùn)行時(shí)類。3.加載到內(nèi)存中的運(yùn)行時(shí)類,會(huì)緩存一定的時(shí)間。在此時(shí)間之內(nèi),我們可以通過不同的方式來獲取此運(yùn)行時(shí)類。*///獲取Class的實(shí)例的方式(前三種方式需要掌握)@Testpublic void test3() throws ClassNotFoundException {//方式一:調(diào)用運(yùn)行時(shí)類的屬性:.classClass clazz1 = Person.class;System.out.println(clazz1);//方式二:通過運(yùn)行時(shí)類的對(duì)象,調(diào)用getClass()Person p1 = new Person();Class clazz2 = p1.getClass();System.out.println(clazz2);//方式三:調(diào)用Class的靜態(tài)方法:forName(String classPath)Class clazz3 = Class.forName("com.atguigu.java.Person"); // clazz3 = Class.forName("java.lang.String");System.out.println(clazz3);System.out.println(clazz1 == clazz2);System.out.println(clazz1 == clazz3);//方式四:使用類的加載器:ClassLoader (了解)ClassLoader classLoader = ReflectionTest.class.getClassLoader();Class clazz4 = classLoader.loadClass("com.atguigu.java.Person");System.out.println(clazz4);System.out.println(clazz1 == clazz4);}//萬事萬物皆對(duì)象?對(duì)象.xxx,File,URL,反射,前端、數(shù)據(jù)庫操作//Class實(shí)例可以是哪些結(jié)構(gòu)的說明:@Testpublic void test4(){Class c1 = Object.class;Class c2 = Comparable.class;Class c3 = String[].class;Class c4 = int[][].class;Class c5 = ElementType.class;Class c6 = Override.class;Class c7 = int.class;Class c8 = void.class;Class c9 = Class.class;int[] a = new int[10];int[] b = new int[100];Class c10 = a.getClass();Class c11 = b.getClass();// 只要數(shù)組的元素類型與維度一樣,就是同一個(gè)ClassSystem.out.println(c10 == c11);} }
    • 疑問1:通過直接new的方式或反射的方式都可以調(diào)用公共的結(jié)構(gòu),開發(fā)中到底用那個(gè)?
      • 建議:直接new的方式。
      • 什么時(shí)候會(huì)使用:反射的方式。 反射的特征:動(dòng)態(tài)性
        答:當(dāng)在編譯的時(shí)候就可以確定創(chuàng)建哪個(gè)對(duì)象,此時(shí)就可以使用new的方式來創(chuàng)建對(duì)象, 如果在編譯時(shí)不知道創(chuàng)建什么對(duì)象,比如說我們后端代碼已經(jīng)跑起來部署到服務(wù)器了, 此時(shí)前端發(fā)送請(qǐng)求來調(diào)用后端接口, 此時(shí)前端具體要操作什么,創(chuàng)建什么對(duì)象, 后端接收到請(qǐng)求后,才回動(dòng)態(tài)的創(chuàng)建這個(gè)對(duì)象; 此時(shí)使用反射就更好,體現(xiàn)了動(dòng)態(tài)性!
    • 疑問2:反射機(jī)制與面向?qū)ο笾械姆庋b性是不是矛盾的?如何看待兩個(gè)技術(shù)?
      答:不矛盾。比如說單例模式,構(gòu)造器已經(jīng)私有化起來了,不建議我們?nèi)?chuàng)建對(duì)象,已經(jīng)提供了一個(gè)對(duì)外創(chuàng)建對(duì)象的公共方法; 可能比我們自己要?jiǎng)?chuàng)建對(duì)象的操作要更好,但是如果你非要自己去通過反射來調(diào)用私有構(gòu)造器來創(chuàng)建對(duì)象,也是允許的!

    二、Class類的理解與獲取Class的實(shí)例

  • Class類的理解
    類的加載過程:
    程序經(jīng)過javac.exe命令以后,會(huì)生成一個(gè)或多個(gè)字節(jié)碼文件(.class結(jié)尾)。接著我們使用java.exe命令對(duì)某個(gè)字節(jié)碼文件進(jìn)行解釋運(yùn)行。相當(dāng)于將某個(gè)字節(jié)碼文件加載到內(nèi)存中。此過程就稱為類的加載。加載到內(nèi)存中的類,我們就稱為運(yùn)行時(shí)類,此運(yùn)行時(shí)類,就作為Class的一個(gè)實(shí)例。
    換句話說,Class的實(shí)例就對(duì)應(yīng)著一個(gè)運(yùn)行時(shí)類。
    加載到內(nèi)存中的運(yùn)行時(shí)類,會(huì)緩存一定的時(shí)間。在此時(shí)間之內(nèi),我們可以通過不同的方式來獲取此運(yùn)行時(shí)類。
  • 獲取Class實(shí)例的幾種方式(前三種方式需要掌握)
  • //方式一:調(diào)用運(yùn)行時(shí)類的屬性:.classClass clazz1 = Person.class;System.out.println(clazz1);//方式二:通過運(yùn)行時(shí)類的對(duì)象,調(diào)用getClass()Person p1 = new Person();Class clazz2 = p1.getClass();System.out.println(clazz2);//方式三:調(diào)用Class的靜態(tài)方法:forName(String classPath)Class clazz3 = Class.forName("com.atguigu.java.Person"); // clazz3 = Class.forName("java.lang.String");System.out.println(clazz3);System.out.println(clazz1 == clazz2);System.out.println(clazz1 == clazz3);//方式四:使用類的加載器:ClassLoader (了解)ClassLoader classLoader = ReflectionTest.class.getClassLoader();Class clazz4 = classLoader.loadClass("com.atguigu.java.Person");System.out.println(clazz4);System.out.println(clazz1 == clazz4);
  • 總結(jié):創(chuàng)建類的對(duì)象的方式?
    • 方式一:new + 構(gòu)造器
    • 方式二:要?jiǎng)?chuàng)建Xxx類的對(duì)象,可以考慮:Xxx、Xxxs、XxxFactory、XxxBuilder類中查看是否有靜態(tài)方法的存在。可以調(diào)用其靜態(tài)方法,創(chuàng)建Xxx對(duì)象。
    • 方式三:通過反射
  • Class實(shí)例可以是哪些結(jié)構(gòu)的說明
  • 三、 使用Classloader加載src目錄下的配置文件

  • 類的加載過程----了解

  • 類的加載器的作用

  • 類的加載器的分類

  • Java類編譯、運(yùn)行的執(zhí)行的流程

  • 使用Classloader加載src目錄下的配置文件

  • @Testpublic void test2() throws Exception {Properties pros = new Properties();//此時(shí)的文件默認(rèn)在當(dāng)前的module下。//讀取配置文件的方式一: // FileInputStream fis = new FileInputStream("jdbc.properties"); // FileInputStream fis = new FileInputStream("src\\jdbc1.properties"); // pros.load(fis);//讀取配置文件的方式二:使用ClassLoader//配置文件默認(rèn)識(shí)別為:當(dāng)前module的src下ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();InputStream is = classLoader.getResourceAsStream("jdbc1.properties");pros.load(is);String user = pros.getProperty("user");String password = pros.getProperty("password");System.out.println("user = " + user + ",password = " + password);}

    四、創(chuàng)建運(yùn)行時(shí)類的對(duì)象

  • 代碼舉例
  • Class<Person> clazz = Person.class; Person obj = clazz.newInstance(); System.out.println(obj);
  • 說明
    newInstance():調(diào)用此方法(JDK1.9過期),創(chuàng)建對(duì)應(yīng)的運(yùn)行時(shí)類的對(duì)象。內(nèi)部調(diào)用了運(yùn)行時(shí)類的空參的構(gòu)造器。
  • 要想此方法正常的創(chuàng)建運(yùn)行時(shí)類的對(duì)象,要求:

    • 運(yùn)行時(shí)類必須提供空參的構(gòu)造器

    • 空參的構(gòu)造器的訪問權(quán)限得夠。通常,設(shè)置為public。
      在javabean中要求提供一個(gè)public的空參構(gòu)造器。原因:

    • 便于通過反射,創(chuàng)建運(yùn)行時(shí)類的對(duì)象

    • 便于子類繼承此運(yùn)行時(shí)類時(shí),默認(rèn)調(diào)用super()時(shí),保證父類此構(gòu)造器

    五、獲取運(yùn)行時(shí)類的完整結(jié)構(gòu)

    • 我們可以通過反射,獲取對(duì)應(yīng)的運(yùn)行時(shí)類中所有的屬性、方法、構(gòu)造器、父類、接口、父類的泛型、包、注解、異常等
  • 獲取class對(duì)象功能:
  • 1. 獲取成員變量們* Field[] getFields() :獲取所有public修飾的成員變量* Field getField(String name) 獲取指定名稱的 public修飾的成員變量* Field[] getDeclaredFields() 獲取所有的成員變量,不考慮修飾符* Field getDeclaredField(String name) 2. 獲取構(gòu)造方法們* Constructor<?>[] getConstructors() * Constructor<T> getConstructor(<?>... parameterTypes) * Constructor<T> getDeclaredConstructor(<?>... parameterTypes) * Constructor<?>[] getDeclaredConstructors() 3. 獲取成員方法們:* Method[] getMethods() * Method getMethod(String name,<?>... parameterTypes) * Method[] getDeclaredMethods() * Method getDeclaredMethod(String name,<?>... parameterTypes) 4. 獲取全類名 * String getName()
  • Field:成員變量
  • * 操作:1. 設(shè)置值* void set(Object obj, Object value) 2. 獲取值* get(Object obj) 3. 忽略訪問權(quán)限修飾符的安全檢查* setAccessible(true):暴力反射
  • Constructor:構(gòu)造方法
  • * 創(chuàng)建對(duì)象:* T newInstance(Object... initargs) * 如果使用空參數(shù)構(gòu)造方法創(chuàng)建對(duì)象,操作可以簡化:Class對(duì)象的newInstance方法
    • Method:方法對(duì)象
  • * 執(zhí)行方法:* Object invoke(Object obj, Object... args) * 獲取方法名稱:* String getName:獲取方法名
  • 代碼演示
  • @Test public void test1(){Class clazz = Person.class;//獲取屬性結(jié)構(gòu)//getFields():獲取當(dāng)前運(yùn)行時(shí)類及其父類中聲明為public訪問權(quán)限的屬性Field[] fields = clazz.getFields();for(Field f : fields){System.out.println(f);}System.out.println();//getDeclaredFields():獲取當(dāng)前運(yùn)行時(shí)類中聲明的所有屬性。(不包含父類中聲明的屬性Field[] declaredFields = clazz.getDeclaredFields();for(Field f : declaredFields){System.out.println(f);} }@Test public void test1(){Class clazz = Person.class;//getMethods():獲取當(dāng)前運(yùn)行時(shí)類及其所父類中聲明為public權(quán)限的方法Method[] methods = clazz.getMethods();for(Method m : methods){System.out.println(m);}System.out.println();//getDeclaredMethods():獲取當(dāng)前運(yùn)行時(shí)類中聲明的所方法。(不包含父類中聲明的方法Method[] declaredMethods = clazz.getDeclaredMethods();for(Method m : declaredMethods){System.out.println(m);} }/* 獲取構(gòu)造器結(jié)構(gòu)*/ @Test public void test1(){Class clazz = Person.class;//getConstructors():獲取當(dāng)前運(yùn)行時(shí)類中聲明為public的構(gòu)造器Constructor[] constructors = clazz.getConstructors();for(Constructor c : constructors){System.out.println(c);}System.out.println();//getDeclaredConstructors():獲取當(dāng)前運(yùn)行時(shí)類中聲明的所的構(gòu)造器Constructor[] declaredConstructors = clazz.getDeclaredConstructors();for(Constructor c : declaredConstructors){System.out.println(c);}}/* 獲取運(yùn)行時(shí)類的父類*/ @Test public void test2(){Class clazz = Person.class;Class superclass = clazz.getSuperclass();System.out.println(superclass); }/* 獲取運(yùn)行時(shí)類的帶泛型的父類*/ @Test public void test3(){Class clazz = Person.class;Type genericSuperclass = clazz.getGenericSuperclass();System.out.println(genericSuperclass); }/* 獲取運(yùn)行時(shí)類的帶泛型的父類的泛型代碼:邏輯性代碼 vs 功能性代碼*/ @Test public void test4(){Class clazz = Person.class;Type genericSuperclass = clazz.getGenericSuperclass();ParameterizedType paramType = (ParameterizedType) genericSuperclass;//獲取泛型類型Type[] actualTypeArguments = paramType.getActualTypeArguments(); // System.out.println(actualTypeArguments[0].getTypeName());System.out.println(((Class)actualTypeArguments[0]).getName()); }/* 獲取運(yùn)行時(shí)類實(shí)現(xiàn)的接口*/ @Test public void test5(){Class clazz = Person.class;Class[] interfaces = clazz.getInterfaces();for(Class c : interfaces){System.out.println(c);}System.out.println();//獲取運(yùn)行時(shí)類的父類實(shí)現(xiàn)的接口Class[] interfaces1 = clazz.getSuperclass().getInterfaces();for(Class c : interfaces1){System.out.println(c);}} /*獲取運(yùn)行時(shí)類所在的包*/ @Test public void test6(){Class clazz = Person.class;Package pack = clazz.getPackage();System.out.println(pack); }/*獲取運(yùn)行時(shí)類聲明的注解*/ @Test public void test7(){Class clazz = Person.class;Annotation[] annotations = clazz.getAnnotations();for(Annotation annos : annotations){System.out.println(annos);} }

    六、調(diào)用運(yùn)行時(shí)類的指定結(jié)構(gòu)

    調(diào)用指定的屬性

    @Test public void testField1() throws Exception {Class clazz = Person.class;//創(chuàng)建運(yùn)行時(shí)類的對(duì)象Person p = (Person) clazz.newInstance();//1. getDeclaredField(String fieldName):獲取運(yùn)行時(shí)類中指定變量名的屬性Field name = clazz.getDeclaredField("name");//2.保證當(dāng)前屬性是可訪問的name.setAccessible(true);//3.獲取、設(shè)置指定對(duì)象的此屬性值name.set(p,"Tom");System.out.println(name.get(p)); }

    調(diào)用指定的方法 重點(diǎn)

    @Testpublic void testMethod() throws Exception {Class clazz = Person.class;//創(chuàng)建運(yùn)行時(shí)類的對(duì)象Person p = (Person) clazz.newInstance();/*1.獲取指定的某個(gè)方法getDeclaredMethod():參數(shù)1 :指明獲取的方法的名稱 參數(shù)2:指明獲取的方法的形參列表*/Method show = clazz.getDeclaredMethod("show", String.class);//2.保證當(dāng)前方法是可訪問的show.setAccessible(true);/*3. 調(diào)用方法的invoke():參數(shù)1:方法的調(diào)用者 參數(shù)2:給方法形參賦值的實(shí)參invoke()的返回值即為對(duì)應(yīng)類中調(diào)用的方法的返回值。*/Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN");System.out.println(returnValue);System.out.println("*************如何調(diào)用靜態(tài)方法*****************");// private static void showDesc()Method showDesc = clazz.getDeclaredMethod("showDesc");showDesc.setAccessible(true);//如果調(diào)用的運(yùn)行時(shí)類中的方法沒返回值,則此invoke()返回null // Object returnVal = showDesc.invoke(null);Object returnVal = showDesc.invoke(Person.class);System.out.println(returnVal);//null}

    調(diào)用指定的構(gòu)造器:

    @Test public void testConstructor() throws Exception {Class clazz = Person.class;//private Person(String name)/*1.獲取指定的構(gòu)造器getDeclaredConstructor():參數(shù):指明構(gòu)造器的參數(shù)列表*/Constructor constructor = clazz.getDeclaredConstructor(String.class);//2.保證此構(gòu)造器是可訪問的constructor.setAccessible(true);//3.調(diào)用此構(gòu)造器創(chuàng)建運(yùn)行時(shí)類的對(duì)象Person per = (Person) constructor.newInstance("Tom");System.out.println(per);}

    七、完整的反射例子

  • 需求:寫一個(gè)"框架",不能改變?cè)擃惖娜魏未a的前提下,可以幫我們創(chuàng)建任意類的對(duì)象,并且執(zhí)行其中任意方法
  • * 實(shí)現(xiàn):1. 配置文件2. 反射* 步驟:1. 將需要?jiǎng)?chuàng)建的對(duì)象的全類名和需要執(zhí)行的方法定義在配置文件中2. 在程序中加載讀取配置文件3. 使用反射技術(shù)來加載類文件進(jìn)內(nèi)存4. 創(chuàng)建對(duì)象5. 執(zhí)行方法

    代碼:

    /*** 框架類*/ public class ReflectTest {public static void main(String[] args) throws Exception {//1.加載配置文件//1.1創(chuàng)建Properties對(duì)象Properties pro = new Properties();//1.2加載配置文件,轉(zhuǎn)換為一個(gè)集合//1.2.1獲取class目錄下的配置文件ClassLoader classLoader = ReflectTest.class.getClassLoader();InputStream is = classLoader.getResourceAsStream("pro.properties");pro.load(is);//2.獲取配置文件中定義的數(shù)據(jù)String className = pro.getProperty("className");String methodName = pro.getProperty("methodName");//3.加載該類進(jìn)內(nèi)存Class cls = Class.forName(className);//4.創(chuàng)建對(duì)象Object obj = cls.newInstance();//5.獲取方法對(duì)象Method method = cls.getMethod(methodName);//6.執(zhí)行方法method.invoke(obj);} }

    pro.properties

    className=cn.itcast.domain.Student methodName=sleep

    八、靜態(tài)代理,動(dòng)態(tài)代理,CGLIB代理

    https://blog.csdn.net/cristianoxm/article/details/106199974

    九、總結(jié)

  • 除了int等基本類型外,Java的其他類型全部都是class(包括interface,void,注解,組數(shù))
  • 而class是由JVM在執(zhí)行過程中動(dòng)態(tài)加載(用到才加載,可以在運(yùn)行期根據(jù)條件來控制加載class)的。JVM在第一次讀取到一種class類型時(shí),將其加載進(jìn)內(nèi)存。每加載一種class,JVM就為其創(chuàng)建一個(gè)Class類型的實(shí)例,并關(guān)聯(lián)起來。
  • public final class Class {private Class() {} }

    可以發(fā)現(xiàn)Class類的構(gòu)造方法是private,只有JVM能創(chuàng)建Class實(shí)例,我們自己的Java程序是無法創(chuàng)建Class實(shí)例的。

  • 由于JVM為每個(gè)加載的class創(chuàng)建了對(duì)應(yīng)的Class實(shí)例,并在實(shí)例中保存了該class的所有信息,包括類名、包名、父類、實(shí)現(xiàn)的接口、所有方法、字段等,因此,如果獲取了某個(gè)Class實(shí)例,我們就可以通過這個(gè)Class實(shí)例獲取到該實(shí)例對(duì)應(yīng)的class的所有信息
    • 獲取方法如下:
    方法一:直接通過一個(gè)class的靜態(tài)變量class獲取: Class cls = String.class;方法二:如果我們有一個(gè)實(shí)例變量,可以通過該實(shí)例變量提供的getClass()方法獲取: String s = "Hello"; Class cls = s.getClass();方法三:如果知道一個(gè)class的完整類名,可以通過靜態(tài)方法Class.forName()獲取: Class cls = Class.forName("java.lang.String");
    • 因?yàn)镃lass實(shí)例在JVM中是唯一的,所以,上述方法獲取的Class實(shí)例是同一個(gè)實(shí)例。可以用==比較兩個(gè)Class實(shí)例:
    Class cls1 = String.class; String s = "Hello"; Class cls2 = s.getClass(); boolean sameClass = cls1 == cls2; // true
  • 如果獲取到了一個(gè)Class實(shí)例,我們就可以通過該Class實(shí)例來創(chuàng)建對(duì)應(yīng)類型的實(shí)例:
  • // 獲取String的Class實(shí)例: Class cls = String.class; // 創(chuàng)建一個(gè)String實(shí)例: String s = (String) cls.newInstance();

    上述代碼相當(dāng)于new String()。通過Class.newInstance()可以創(chuàng)建類實(shí)例,它的局限是:只能調(diào)用public的無參數(shù)構(gòu)造方法。帶參數(shù)的構(gòu)造方法,或者非public的構(gòu)造方法都無法通過Class.newInstance()被調(diào)用。

  • 訪問字段,獲取字段值,修改字段值
    • 對(duì)任意的一個(gè)Object實(shí)例,只要我們獲取了它的Class,就可以獲取它的一切信息。
      Class類提供了以下幾個(gè)方法來獲取字段:
    • Field getField(name):根據(jù)字段名獲取某個(gè)public的field(包括父類) Field
    • getDeclaredField(name):根據(jù)字段名獲取當(dāng)前類的某個(gè)field(不包括父類) Field[]
    • getFields():獲取所有public的field(包括父類) Field[]
    • getDeclaredFields():獲取當(dāng)前類的所有field(不包括父類)
    • 進(jìn)而可以通過Field實(shí)例可以獲取字段信息:getName(),getType(),getModifiers()
    Object p = new Person("Xiao Ming");Class c = p.getClass();Field f = c.getDeclaredField("name");//正常情況下,private修飾的屬性是無法被獲取的,調(diào)用Field.setAccessible(true)后,不管這個(gè)字段是不是public,一律允許訪問。f.setAccessible(true);//獲取字段值,通過get()Object value = f.get(p);

    疑問:如果使用反射可以獲取private字段的值,那么類的封裝還有什么意義?答案是正常情況下,我們總是通過p.name來訪問Person的name字段,編譯器會(huì)根據(jù)public、protected和private決定是否允許訪問字段,這樣就達(dá)到了數(shù)據(jù)封裝的目的。而反射是一種非常規(guī)的用法,使用反射,首先代碼非常繁瑣,其次,它更多地是給工具或者底層框架來使用,目的是在不知道目標(biāo)實(shí)例任何信息的情況下,獲取特定字段的值。此外,setAccessible(true)可能會(huì)失敗。如果JVM運(yùn)行期存在SecurityManager,那么它會(huì)根據(jù)規(guī)則進(jìn)行檢查,有可能阻止setAccessible(true)。例如,某個(gè)SecurityManager可能不允許對(duì)java和javax開頭的package的類調(diào)用setAccessible(true),這樣可以保證JVM核心庫的安全。

    • 修改字段值
      修改字段值是通過Field.set(Object, Object)實(shí)現(xiàn)的,其中第一個(gè)Object參數(shù)是指定的實(shí)例,第二個(gè)Object參數(shù)是待修改的值
  • 獲取方法、調(diào)用方法
    • 獲取方法
      我們已經(jīng)能通過Class實(shí)例獲取所有Field對(duì)象,同樣的,可以通過Class實(shí)例獲取所有Method信息。Class類提供了以下幾個(gè)方法來獲取Method
    • Method getMethod(name, Class…):獲取某個(gè)public的Method(包括父類)
    • Method getDeclaredMethod(name, Class…):獲取當(dāng)前類的某個(gè)Method(不包括父類)
    • Method[] getMethods():獲取所有public的Method(包括父類)
    • Method[] getDeclaredMethods():獲取當(dāng)前類的所有Method(不包括父類)

    一個(gè)Method對(duì)象包含一個(gè)方法的所有信息:

    • getName():返回方法名稱,例如:“getScore”;
    • getReturnType():返回方法返回值類型,也是一個(gè)Class實(shí)例,例如:String.class;
    • getParameterTypes():返回方法的參數(shù)類型,是一個(gè)Class數(shù)組,例如:{String.class, int.class};
    • getModifiers():返回方法的修飾符,它是一個(gè)int,不同的bit表示不同的含義。
    public class Main {public static void main(String[] args) throws Exception {Class stdClass = Student.class;// 獲取public方法getScore,參數(shù)為String:System.out.println(stdClass.getMethod("getScore", String.class));// 獲取繼承的public方法getName,無參數(shù):System.out.println(stdClass.getMethod("getName"));// 獲取private方法getGrade,參數(shù)為int:System.out.println(stdClass.getDeclaredMethod("getGrade", int.class));} } class Student extends Person {public int getScore(String type) {return 99;}private int getGrade(int year) {return 1;} } class Person {public String getName() {return "Person";} }
    • 調(diào)用方法invoke(Object,Object):invoke的第一個(gè)參數(shù)是對(duì)象實(shí)例,即在哪個(gè)實(shí)例上調(diào)用該方法,后面的可變參數(shù)要與方法參數(shù)一致,否則將報(bào)錯(cuò)
    public class Main {public static void main(String[] args) throws Exception {// String對(duì)象:String s = "Hello world";// 獲取String substring(int)方法,參數(shù)為int:Method m = String.class.getMethod("substring", int.class);// 在s對(duì)象上調(diào)用該方法并獲取結(jié)果:String r = (String) m.invoke(s, 6);// 打印調(diào)用結(jié)果:System.out.println(r);} }

    調(diào)用靜態(tài)方法:如果獲取到的Method表示一個(gè)靜態(tài)方法,調(diào)用靜態(tài)方法時(shí),由于無需指定實(shí)例對(duì)象,所以invoke方法傳入的第一個(gè)參數(shù)永遠(yuǎn)為null

    public class Main {public static void main(String[] args) throws Exception {// 獲取Integer.parseInt(String)方法,參數(shù)為String:Method m = Integer.class.getMethod("parseInt", String.class);// 調(diào)用該靜態(tài)方法并獲取結(jié)果:Integer n = (Integer) m.invoke(null, "12345");// 打印調(diào)用結(jié)果:System.out.println(n);} }
    • 調(diào)用非public方法:跟獲取非pubilc屬性相似,設(shè)置Method.setAccessible(true)允許其調(diào)用
    • 多態(tài)性:一個(gè)Person類定義了hello()方法,并且它的子類Student也覆寫了hello()方法,那么,從Person.class獲取的Method,作用于Student實(shí)例時(shí),調(diào)用的方法到底是哪個(gè)?
    public class Main {public static void main(String[] args) throws Exception {// 獲取Person的hello方法:Method h = Person.class.getMethod("hello");// 對(duì)Student實(shí)例調(diào)用hello方法:h.invoke(new Student());} }class Person {public void hello() {System.out.println("Person:hello");} }class Student extends Person {public void hello() {System.out.println("Student:hello");} }

    運(yùn)行上述代碼,發(fā)現(xiàn)打印出的是Student:hello,因此,使用反射調(diào)用方法時(shí),仍然遵循多態(tài)原則:即總是調(diào)用實(shí)際類型的覆寫方法(如果存在)

  • 調(diào)用構(gòu)造方法
  • 我們上面知道,可以通過newInstance()創(chuàng)建對(duì)象,調(diào)用Class.newInstance()的局限是,它只能調(diào)用該類的public無參數(shù)構(gòu)造方法。如果構(gòu)造方法帶有參數(shù),或者不是public,就無法直接通過Class.newInstance()來調(diào)用。為了調(diào)用任意的構(gòu)造方法,Java的反射API提供了Constructor對(duì)象,它包含一個(gè)構(gòu)造方法的所有信息,可以創(chuàng)建一個(gè)實(shí)例。Constructor對(duì)象和Method非常類似,不同之處僅在于它是一個(gè)構(gòu)造方法,并且,調(diào)用結(jié)果總是返回實(shí)例

    public class Main {public static void main(String[] args) throws Exception {// 獲取構(gòu)造方法Integer(int):Constructor cons1 = Integer.class.getConstructor(int.class);// 調(diào)用構(gòu)造方法:Integer n1 = (Integer) cons1.newInstance(123);System.out.println(n1);// 獲取構(gòu)造方法Integer(String)Constructor cons2 = Integer.class.getConstructor(String.class);Integer n2 = (Integer) cons2.newInstance("456");System.out.println(n2);} }

    通過Class實(shí)例獲取Constructor的方法如下:

    • getConstructor(Class…):獲取某個(gè)public的Constructor;
    • getDeclaredConstructor(Class…):獲取某個(gè)Constructor;
    • getConstructors():獲取所有public的Constructor;
    • getDeclaredConstructors():獲取所有Constructor。

    注意Constructor總是當(dāng)前類定義的構(gòu)造方法,和父類無關(guān),因此不存在多態(tài)的問題。調(diào)用非public的Constructor時(shí),必須首先通過setAccessible(true)設(shè)置允許訪問。setAccessible(true)可能會(huì)失敗。

  • 獲取父類和實(shí)現(xiàn)接口
    • 獲取父類
    public class Main {public static void main(String[] args) throws Exception {Class i = Integer.class;Class n = i.getSuperclass();System.out.println(n);Class o = n.getSuperclass();System.out.println(o);System.out.println(o.getSuperclass());} }
    • 獲取實(shí)現(xiàn)接口
    public class Main {public static void main(String[] args) throws Exception {Class s = Integer.class;Class[] is = s.getInterfaces();for (Class i : is) {System.out.println(i);}} }
    • 是否可以向上轉(zhuǎn)型isAssignableFrom()
    // Object o = ? Object.class.isAssignableFrom(Integer.class); // true,因?yàn)镮nteger可以賦值給Object // Integer i = ? Integer.class.isAssignableFrom(Number.class); // false,因?yàn)镹umber不能賦值給Integer
  • 靜態(tài)代理VSJDK動(dòng)態(tài)代理VS CGLib動(dòng)態(tài)代理
    靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別主要在: 靜態(tài)代理在編譯時(shí)就已經(jīng)實(shí)現(xiàn),編譯完成后代理類是一個(gè)實(shí)際的class文件 動(dòng)態(tài)代理是在運(yùn)行時(shí)動(dòng)態(tài)生成的,即編譯完成后沒有實(shí)際的class文件,而是在運(yùn)行時(shí)動(dòng)態(tài)生成類字節(jié)碼,并加載到JVM中。JDK動(dòng)態(tài)代理模式只能代理接口,如果要代理類那么就不行了。而CGLIB則是代理類。使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口,使用cglib代理的對(duì)象則無需實(shí)現(xiàn)接口,達(dá)到代理類無侵入。同時(shí)CGLIB也有其缺陷,那就是必須目標(biāo)類必須是可以繼承的,如果目標(biāo)類不可繼承,那么我們就無法使用CGLIB來增強(qiáng)該類。
    • 靜態(tài)代理:

    定義接口:

    public interface Hello {void morning(String name); }

    編寫實(shí)現(xiàn)類:

    public class HelloWorld implements Hello {public void morning(String name) {System.out.println("Good morning, " + name);} }

    創(chuàng)建實(shí)例,轉(zhuǎn)型為接口并調(diào)用:

    Hello hello = new HelloWorld(); hello.morning("Bob");
    • 動(dòng)態(tài)代理
    public class HelloDynamicProxy implements Hello {InvocationHandler handler;public HelloDynamicProxy(InvocationHandler handler) {this.handler = handler;}public void morning(String name) {handler.invoke(this,Hello.class.getMethod("morning", String.class),new Object[] { name });} }
    • 一個(gè)較復(fù)雜的動(dòng)態(tài)代理例子
    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class DynamicProxy {public static void main(String[] args) {// 小韭菜學(xué)生類Student ordinaryStudents = new OrdinaryStudents();ordinaryStudents.eat();ordinaryStudents.write();// 現(xiàn)在有一位特殊的學(xué)生,他是區(qū)長的兒子,我們自然要對(duì)他額外照顧,要給他加一下功能。// 一種思路是定義一個(gè)類:區(qū)長的兒子類,他繼承自學(xué)生類,但世上兒子千千萬,有區(qū)長的兒子,也有市長的兒子,更有省長的兒子,不能把他們挨個(gè)定義出來,// 現(xiàn)在就可以使用動(dòng)態(tài)代理機(jī)制,動(dòng)態(tài)的給區(qū)長的兒子加上功能,以后碰到市長、省長的兒子也同樣處理。// InvocationHandler作用就是,當(dāng)代理對(duì)象的原本方法被調(diào)用的時(shí)候,會(huì)重定向到一個(gè)方法,// 這個(gè)方法就是InvocationHandler里面定義的內(nèi)容,同時(shí)會(huì)替代原本方法的結(jié)果返回。// InvocationHandler接收三個(gè)參數(shù):proxy,代理后的實(shí)例對(duì)象。 method,對(duì)象被調(diào)用方法。args,調(diào)用時(shí)的參數(shù)。InvocationHandler handler = (proxy, method, handlerArgs) -> {// 從定義eat方法。if ("eat".equals(method.getName())) {System.out.println("我可以吃香喝辣!");return null;}// 從定義write方法。if ("write".equals(method.getName())) {System.out.println("我的作文題目是《我的區(qū)長父親》。");// 調(diào)用普通學(xué)生類的write方法,流程還是要走的,還是要交一篇作文上去,不能太明目張膽。method.invoke(ordinaryStudents, handlerArgs);System.out.println("我的作文拿了區(qū)作文競賽一等獎(jiǎng)!so easy!");return null;}return null;};// 對(duì)這個(gè)實(shí)例對(duì)象代理生成一個(gè)代理對(duì)象。// 被代理后生成的對(duì)象,是通過People接口的字節(jié)碼增強(qiáng)方式創(chuàng)建的類而構(gòu)造出來的。它是一個(gè)臨時(shí)構(gòu)造的實(shí)現(xiàn)類的對(duì)象。// loder和interfaces基本就是決定了這個(gè)類到底是個(gè)怎么樣的類。而h是InvocationHandler,決定了這個(gè)代理類到底是多了什么功能.// 通過這些接口和類加載器,拿到這個(gè)代理類class。然后通過反射的技術(shù)復(fù)制拿到代理類的構(gòu)造函數(shù),// 最后通過這個(gè)構(gòu)造函數(shù)new個(gè)一對(duì)象出來,同時(shí)用InvocationHandler綁定這個(gè)對(duì)象。// 最終實(shí)現(xiàn)可以在運(yùn)行的時(shí)候才切入改變類的方法,而不需要預(yù)先定義它。Student sonOfDistrict = (Student) Proxy.newProxyInstance(ordinaryStudents.getClass().getClassLoader(), ordinaryStudents.getClass().getInterfaces(), handler);sonOfDistrict.eat();sonOfDistrict.write();} }/*** 學(xué)生接口,能跑,能吃,能寫作文。*/ interface Student {void eat();void run();void write(); } /*** 小韭菜,能跑,能吃,能寫作文。*/ class OrdinaryStudents implements Student {@Overridepublic void eat() {System.out.println("我在吃飯!");}@Overridepublic void run() {System.out.println("我在跑步!");}@Overridepublic void write() {System.out.println("我在寫作文!");} }
    • 實(shí)現(xiàn)動(dòng)態(tài)代理的步驟:

    1.創(chuàng)建接口,定義目標(biāo)類要完成的功能.
    2.創(chuàng)建目標(biāo)類實(shí)現(xiàn)接口
    3.創(chuàng)建InvocationHandler 接口的實(shí)現(xiàn)類,在invoke方法中完成代理的功能.
    3.1 調(diào)用目標(biāo)方法
    3.2 增強(qiáng)功能
    4.使用Proxy類靜態(tài)方法創(chuàng)建代理對(duì)象,并把返回值轉(zhuǎn)為接口類型.

    • 創(chuàng)建接口
    public interface SayGoodbye {void sayGoodbye(String name); } public interface SayHello {void sayHello(String name); }
    • 實(shí)現(xiàn)接口
    public class goodByeImpl implements SayGoodbye {@Overridepublic void sayGoodbye(String name) {System.out.println("GoodBye"+name);} } public class HelloImpl implements SayHello{@Overridepublic void sayHello(String name) {System.out.println("Hello"+name);} }
    • 創(chuàng)建InvocationHandler 接口的實(shí)現(xiàn)類
    public class ServiceProxy implements InvocationHandler {private Object target;public void InvokeBefore(){System.out.println("調(diào)用前");}public void InvokeAfter(){System.out.println("調(diào)用后");}public Object getInstance(Object target) {this.target = target;//target.getClass().getClassLoader() 類加載器,動(dòng)態(tài)代理的類加載器必然和被代理的對(duì)象在同一個(gè)加載器,所以直接使用//target.getClass().getInterfaces() 實(shí)現(xiàn)的接口//this 該方法只負(fù)責(zé)實(shí)例化代理,至于代理業(yè)務(wù)的流程規(guī)范,由InvocationHandler(this)來定義return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);}@Override//Object proxy代理類//Method method要攔截(優(yōu)化)的方法//Object[] args方法的參數(shù)public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result;//反射方法前調(diào)用InvokeBefore();//反射執(zhí)行方法 相當(dāng)于調(diào)用target.sayHelllo;result = method.invoke(target,args);//反射方法后調(diào)用.InvokeAfter();return result;} }
    • 使用Proxy類靜態(tài)方法創(chuàng)建代理對(duì)象,并把返回值轉(zhuǎn)為接口類型.
    public class ProxyTest {public static void main(String[] args) {//生成proxy類ServiceProxy proxy = new ServiceProxy();//獲取SayGoodbye代理對(duì)象,此處需要傳入goodByeImpl實(shí)例給getInstance方法,最終被newProxyInstance調(diào)用SayGoodbye sgServiceProxy = (SayGoodbye) proxy.getInstance(new goodByeImpl());//通過代理對(duì)象調(diào)用方法sgServiceProxy.sayGoodbye(" lisi");//獲取SayHello代理對(duì)象SayHello shServiceProxy=(SayHello)proxy.getInstance(new HelloImpl());//調(diào)用對(duì)象方法shServiceProxy.sayHello(" zhangsan");} }

    參考文章

    總結(jié)

    以上是生活随笔為你收集整理的反射及代理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    久久伊人国产精品 | 91桃色国产在线播放 | 97色噜噜 | 99精品视频在线观看 | 久久a免费视频 | 天天射天天操天天 | 久久久99精品免费观看 | 国产99久久久久久免费看 | 日韩性xxx| 一区二区三区四区五区在线 | 欧美日韩高清一区二区三区 | 国产黄色av网站 | 亚洲少妇久久 | 日韩在线免费播放 | 中文一二区| 草久热| 久久狠狠婷婷 | 狠狠色噜噜狠狠狠狠 | 黄色片免费电影 | 国产精品2区| 久久国产精品视频 | 国产一区私人高清影院 | 国产中年夫妇高潮精品视频 | 开心激情网五月天 | 丁香六月天 | 激情欧美一区二区三区 | 69av视频在线观看 | www.狠狠色 | 在线成人高清电影 | 成年人免费电影在线观看 | 久久日韩精品 | 操一草| 国产精品视频全国免费观看 | 网站在线观看日韩 | 欧美亚洲免费在线一区 | 久久精品国产精品亚洲 | 午夜丁香视频在线观看 | 青青草在久久免费久久免费 | 成人网在线免费视频 | 亚洲黄色在线观看 | 国产亚洲精品女人久久久久久 | 国产精品久久久久久久久婷婷 | 激情网综合 | 久久婷婷视频 | 亚洲精品久久久久中文字幕二区 | 国产又粗又猛又色又黄网站 | 成人h在线 | 久草在线资源免费 | 久久国产精品免费视频 | 黄色三级网站在线观看 | 天天干人人 | 2023国产精品自产拍在线观看 | 亚洲成人av片在线观看 | 亚洲午夜精品一区 | 亚洲精品玖玖玖av在线看 | 日日干天天 | 久久精品中文 | 中文字幕久久精品 | 久草在线视频精品 | 国产精品久久毛片 | 成人亚洲精品久久久久 | 亚洲欧美视屏 | 91大神免费视频 | 五月天堂网| 日本中文字幕在线视频 | 日韩视频免费看 | 人操人 | 成人在线免费小视频 | 国产精品大尺度 | 干干日日 | 亚洲精品午夜视频 | 国产日韩欧美在线观看视频 | 国产精品一区在线观看 | 超碰在线cao| 一本一本久久aa综合精品 | 五月天六月婷婷 | 免费中文字幕在线观看 | 免费在线观看一区二区三区 | 91mv.cool在线观看 | 麻花豆传媒一二三产区 | 麻豆视频在线 | 日韩欧美在线影院 | 九九激情视频 | 国产精品永久在线 | 操操操干干干 | 欧美日韩午夜在线 | 黄色三几片 | 九九热在线视频 | 国产一区二区久久精品 | 精品免费久久久久 | 伊人五月天.com | 亚洲乱码中文字幕综合 | 中文字幕第一页在线 | 九九九在线观看视频 | 91自拍视频在线 | 波多野结衣视频一区二区三区 | 日韩理论片在线观看 | 婷婷视频在线 | 日韩xxxbbb | 天天操天天干天天操天天干 | 99久久国产免费,99久久国产免费大片 | 成人久久综合 | 在线亚洲免费视频 | 久久久天堂 | 久久免费视频6 | 天天色.com | 日韩精品在线视频 | 日本中文字幕在线 | 在线观看黄污 | 国产高清视频在线观看 | 五月天六月色 | 久久私人影院 | 日韩视频中文字幕在线观看 | 国产精品毛片一区二区在线看 | 久久久人人人 | 四虎精品成人免费网站 | 一本一本久久a久久精品综合妖精 | 午夜精品久久 | 91在线看视频免费 | 亚洲精品自在在线观看 | 久久视频中文字幕 | 亚洲精品白浆高清久久久久久 | 免费观看一区二区 | 亚洲精品一区二区久 | 久久综合九色 | 久草久草久草久草 | 97爱爱爱| 字幕网资源站中文字幕 | 狠狠色丁香久久婷婷综 | 国产在线不卡一区 | 中文字幕视频 | 久草91视频 | 中文字幕在线资源 | 99热超碰在线 | 91久久丝袜国产露脸动漫 | 日韩有码中文字幕在线 | 国产精品成人一区二区三区 | 色射爱| av蜜桃在线| 成在线播放 | 91高清完整版在线观看 | 麻豆传媒在线免费看 | 亚洲精品免费在线观看视频 | 国产成人精品av久久 | 欧美性猛片| 天天干天天干 | 国产成人性色生活片 | 欧美片一区二区三区 | 91在线一区二区 | 国产小视频免费在线观看 | 久久电影中文字幕视频 | 国产人成看黄久久久久久久久 | 国产 精品 资源 | 天天干.com| 国产成人精品久久亚洲高清不卡 | 国产无遮挡又黄又爽在线观看 | 中文字幕有码在线播放 | 8x成人免费视频 | 国产午夜三级一区二区三桃花影视 | 久久久久久毛片精品免费不卡 | www成人精品 | 96香蕉视频 | 日韩理论影院 | 黄色小说免费观看 | japanesexxxhd奶水 91在线精品一区二区 | 精品一区二区精品 | 在线小视频 | 久久精美视频 | 激情网在线观看 | 亚洲午夜久久久影院 | 久久99亚洲精品久久 | 久久成年人| 玖玖在线看 | 97视频免费观看2区 亚洲视屏 | 国模精品在线 | 国产在线精品一区二区 | 亚洲日韩精品欧美一区二区 | 99精品免费久久久久久久久日本 | 亚洲黄色精品 | 久久精品中文字幕免费mv | 不卡视频在线 | 在线一二区 | 91精品日韩 | 亚洲五月 | 欧美福利精品 | 久久精品日产第一区二区三区乱码 | 日韩在线观看三区 | 欧美精品乱码久久久久久按摩 | 九色琪琪久久综合网天天 | 在线观看日本韩国电影 | 99久久夜色精品国产亚洲 | 九九交易行官网 | 久久精品国产免费观看 | 97在线观看免费 | 黄色三级在线观看 | 成人羞羞视频在线观看免费 | 手机在线永久免费观看av片 | 日本精品久久久久中文字幕5 | 国产视频首页 | 黄色大片免费网站 | 婷婷色五| 91最新在线视频 | 2023av在线| 911免费视频 | 久久人人爽爽 | 中文字幕专区高清在线观看 | 亚洲 欧美 91 | 91精品国自产拍天天拍 | 99精品电影 | 丝袜美腿亚洲综合 | 国产精品黄色 | 日韩毛片在线播放 | 国产视频 久久久 | 少妇bbw揉bbb欧美 | 日韩高清毛片 | 中文字幕久久精品 | 亚洲伦理中文字幕 | 成人丁香花 | 亚洲精品久久久久www | 日韩在线观看中文 | 欧美在线一二 | 国产精品白丝jk白祙 | 高清视频一区二区三区 | 亚洲综合欧美精品电影 | 色美女在线 | 成人av免费网站 | 国产一区在线看 | 亚洲免费精品一区二区 | 久操视频在线观看 | 一级成人在线 | 毛片a级片 | 一级理论片在线观看 | 亚洲在线看| 五月婷av| 五月婷婷激情综合 | 欧美极度另类性三渗透 | 91精品网站 | 成人午夜精品福利免费 | 精品国产aⅴ麻豆 | 欧美一区在线看 | 日韩久久精品一区二区 | 国产福利不卡视频 | 欧美性爽爽 | 精油按摩av | 欧美一级片免费在线观看 | 亚洲视频 在线观看 | 亚洲www天堂com | 日本在线观看一区 | 欧美激情精品久久久久久免费印度 | 欧美日韩中文字幕综合视频 | 国产香蕉av | 日本99久久 | 色永久免费视频 | 日日草夜夜操 | 激情深爱| 国产一区在线播放 | 久久久电影 | 久久精品成人欧美大片古装 | 午夜一级免费电影 | 天天操操操操操操 | 亚洲一区二区三区精品在线观看 | 成人在线免费视频观看 | 九九九电影免费看 | 国产一区欧美在线 | 国产人成一区二区三区影院 | 久久免费视频网 | 免费看的黄色的网站 | 亚洲 欧洲 国产 精品 | wwwwww色 | 色噜噜日韩精品欧美一区二区 | 成人久久18免费网站 | 激情久久伊人 | 国产视频1区2区3区 久久夜视频 | 亚欧日韩成人h片 | 91最新网址 | 一区在线播放 | 国产 欧美 在线 | 久久国产精品99久久人人澡 | 天天干视频在线 | 天天天干天天射天天天操 | 欧美福利网站 | 天天做天天爱天天综合网 | 久久久久久国产精品免费 | 麻豆视频网址 | 亚洲国产精品999 | 人人超碰免费 | 精品国产欧美一区二区三区不卡 | 亚洲国产影院av久久久久 | 在线日韩视频 | 色94色欧美| 九九国产视频 | 日韩丝袜 | 成人理论电影 | 91大片成人网| 亚洲闷骚少妇在线观看网站 | 久草资源在线观看 | 三级在线国产 | 国产黄色片一级 | 国产精品高清在线 | 久久a国产 | 97国产精品一区二区 | 人人澡人人澡人人 | 亚洲精品乱码久久久久久高潮 | 精品毛片在线 | 久久久久北条麻妃免费看 | 狠狠操电影网 | 日韩有码网站 | 波多野结衣电影一区二区 | www.久久久.com | 欧美日在线| 日韩v欧美v日本v亚洲v国产v | 91在线公开视频 | 国产精品一区一区三区 | 国产精品丝袜久久久久久久不卡 | 麻豆91网站 | 国产91综合一区在线观看 | 99热精品国产一区二区在线观看 | 一区二区三区高清 | 日韩av美女| 欧美日韩在线视频一区二区 | 深爱激情婷婷网 | 中文字幕亚洲高清 | 欧美日韩国产区 | 欧美 日韩 国产 成人 在线 | 男女视频久久久 | 99在线观看视频网站 | 99在线观看视频 | 亚洲国产精品影院 | 美女网站黄免费 | 欧美成人va| 中文字幕免 | 高潮毛片无遮挡高清免费 | 亚洲精品免费在线观看视频 | 国产精品大片在线观看 | 波多野结衣网址 | a电影免费看 | 日韩在线观看一区二区三区 | 91九色视频网站 | 干狠狠| 国产免费小视频 | 99精品视频在线观看免费 | 中文字幕日韩国产 | 久久蜜桃av | 国产中文在线视频 | 久久y | 国产最新在线视频 | 超级碰视频 | 一区二区精品在线视频 | 国产福利一区二区三区视频 | 在线成人免费电影 | 91视频免费看 | 在线影院av | 一区二区精品视频 | 日日干天天爽 | 中文av资源站 | 九九热精品国产 | 国产又粗又猛又爽又黄的视频先 | 天天综合网天天 | 亚洲最大在线视频 | 91麻豆精品91久久久久同性 | 91成人免费看| 久久综合99| 精品久久久久久久久久久久久久久久久久 | 久草免费资源 | 色婷婷亚洲综合 | 在线看岛国av| 久久国产精品免费一区 | 九九交易行官网 | 国产精品成人一区二区三区 | 91亚洲精品久久久中文字幕 | 六月婷婷久香在线视频 | 国产精品日韩在线播放 | 天天艹日日干 | 玖玖玖在线观看 | 国产在线视频一区二区三区 | 成人av手机在线 | 精品亚洲免费 | 91亚洲成人 | 欧美性生爱 | 99精品久久久久久久久久综合 | av在线播放快速免费阴 | 久久精品99国产精品 | 成人a在线观看高清电影 | 婷婷激情站 | 久久艹国产 | 国产欧美综合在线观看 | 九九热久久免费视频 | 国内视频在线 | 中文字幕日韩国产 | 欧美国产日韩激情 | 丝袜美腿一区 | 黄色av高清 | 99这里有精品| 中文字幕专区高清在线观看 | 国产视频一区二区三区在线 | 亚洲永久精品在线 | 精品国产一区二区三区男人吃奶 | 欧美国产高清 | 久久国产三级 | a天堂一码二码专区 | 亚洲香蕉视频 | 色综合天天色综合 | 日韩激情视频在线观看 | 国内成人精品2018免费看 | 日韩在线观看av | 91av综合 | 久草久草在线观看 | 日韩网站在线看片你懂的 | 超薄丝袜一二三区 | 欧美日韩不卡在线 | 欧美一级欧美一级 | 天天干夜夜操视频 | 亚洲国产免费网站 | 欧美 激情在线 | 免费国产亚洲视频 | 伊人官网| 韩国av电影在线观看 | 伊人电影天堂 | 在线观看一级视频 | 亚洲精品国产精品乱码不99热 | 欧美日韩在线第一页 | 日韩激情影院 | 成人av午夜| 麻豆传媒一区二区 | 91在线精品视频 | 国产精品丝袜久久久久久久不卡 | 在线观看视频免费大全 | 菠萝菠萝在线精品视频 | 五月婷婷激情综合 | 91污视频在线观看 | 人人爽人人看 | 特黄一级毛片 | 中文字幕乱码日本亚洲一区二区 | 久久av在线 | 久久久国产影院 | 丁香国产视频 | 91亚洲国产成人 | 中文字幕亚洲高清 | 色综合天天色 | 日韩中文字幕免费在线播放 | 91免费在线| 欧美另类交在线观看 | 91成人免费看片 | 成人免费在线网 | 91大神电影 | 日韩在线观看第一页 | 日韩av一区在线观看 | 日韩高清观看 | 天天色天天操综合网 | 久久精品国产免费观看 | 国产专区在线播放 | 日本免费久久高清视频 | 欧美黑人性猛交 | 久久只精品99品免费久23小说 | 日韩精品无码一区二区三区 | 最近免费中文字幕 | 国产福利精品一区二区 | 天天要夜夜操 | 国产一级精品视频 | 久久国产一二区 | 波多野结衣久久资源 | 久久色视频 | 国产精品久久久久久五月尺 | 亚洲精品午夜久久久久久久久久久 | 97超碰在线免费观看 | 高潮毛片无遮挡高清免费 | 99精品久久久久 | 亚洲午夜在线视频 | 天天操狠狠操 | 免费观看福利视频 | 国产一级片视频 | 日韩视频一区二区在线观看 | 91黄色在线看 | 免费观看一级视频 | 国产精品美女免费视频 | 制服丝袜在线91 | 日日夜夜天天综合 | 精品在线亚洲视频 | 国产精品精品久久久久久 | 亚洲精品黄色片 | 久久免费观看视频 | 97人人澡人人爽人人模亚洲 | 国产福利小视频在线 | 男女精品久久 | 久久久久久久免费 | 最新91在线视频 | 免费的黄色av | 久久久精品欧美一区二区免费 | 91私密保健 | 福利视频网站 | 日韩毛片久久久 | 狠狠夜夜| 日韩特黄一级欧美毛片特黄 | 国产三级精品在线 | 天天骚夜夜操 | 天天操狠狠操 | 国产视频资源在线观看 | 午夜精品电影一区二区在线 | 亚州精品天堂中文字幕 | 久久激情网站 | 国产一区二区三区在线 | 91香蕉视频在线下载 | 日韩在线视频播放 | 4hu视频 | 国产精品久久久久久久久久免费看 | 国产91对白在线 | 久久久久久久久久影院 | 成人免费共享视频 | 色综合天天做天天爱 | 美女精品久久久 | 国产高清在线看 | 96av视频| 久久久免费精品国产一区二区 | 精品一区二区在线免费观看 | 天天摸天天操天天舔 | 免费看麻豆 | 天天射天天干天天操 | 婷婷丁香久久五月婷婷 | 日韩理论片中文字幕 | 波多野结衣电影一区二区 | 亚洲蜜桃在线 | www.黄色在线| 在线看一区二区 | 国产精品毛片久久久久久 | 高清av网站 | 日韩欧美高清在线观看 | 日日干网址 | 亚洲美女在线国产 | 日本女人的性生活视频 | 成人资源站 | 97免费| 日韩高清一区二区 | 国产精品一级在线 | 成人97人人超碰人人99 | 视频一区视频二区在线观看 | 毛片久久久| 久久视频中文字幕 | 天天做天天爱天天综合网 | 国产美女无遮挡永久免费 | 久久99久久99精品免视看婷婷 | 国产成人免费观看久久久 | 免费高清影视 | 色成人亚洲 | 狠狠88综合久久久久综合网 | 欧美日韩中文在线观看 | 免费a级观看 | 成人黄色免费观看 | 久久久精品亚洲 | 亚洲精品视频在线播放 | 91丨九色丨勾搭 | 91精品国产自产91精品 | 韩日电影在线 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 一本一道久久a久久综合蜜桃 | 久久综合中文色婷婷 | 婷婷五综合| 精品国产成人 | 国产在线国偷精品产拍 | 黄色av电影免费观看 | 久久99欧美 | 久久久www成人免费毛片 | 狠狠色丁香久久婷婷综合五月 | 毛片视频电影 | 欧美精品久久人人躁人人爽 | 91.麻豆视频 | 99精品免费久久久久久久久日本 | 国产视频色 | 中文字幕国内精品 | 一区二区三区免费在线观看 | 久久久亚洲成人 | 久久精品黄 | 天天插视频 | 色婷婷狠狠五月综合天色拍 | 天天操天天操天天操天天 | 亚洲理论视频 | 国产精品资源在线观看 | 五月天综合色 | 欧美一级视频免费 | 久久免费播放 | 免费色视频网站 | 黄色一级影院 | 激情视频网页 | www.夜夜草 | 99视频精品 | 婷婷av网| 麻豆免费在线播放 | 中文字幕中文中文字幕 | 在线看日韩 | 日本三级全黄少妇三2023 | 亚洲综合在线五月 | 日本中文在线 | 99久久久久久久久久 | www视频在线播放 | 在线观看中文字幕2021 | 欧美精品在线观看 | 国内精品久久久久国产 | 天堂av一区二区 | 国产一级免费在线观看 | 国产精品24小时在线观看 | 一本一道久久a久久综合蜜桃 | 国产精品中文久久久久久久 | 97视频网址 | 日韩欧美国产精品 | av超碰免费在线 | 国产视频亚洲视频 | 成人在线视频免费观看 | 国产精品久久久久久久久久久久午夜 | 亚洲a在线观看 | 国产精品久久久久av | 久久欧美视频 | 天天射狠狠干 | 成人在线免费视频观看 | 国产精品视频观看 | 97在线影视 | 久久99国产精品二区护士 | 欧美另类人妖 | 欧美日韩高清一区二区三区 | 久久夜色网| 欧美影片 | 大型av综合网站 | 色综合天天干 | 91av精品 | www狠狠操| 九九国产精品视频 | 91成人短视频在线观看 | 天天爽夜夜爽人人爽曰av | av片在线观看免费 | 日日爽日日操 | 午夜精品久久久久久久99婷婷 | 欧美地下肉体性派对 | 国产精品小视频网站 | 国产精品不卡av | 日批视频| 粉嫩av一区二区三区免费 | 国产亚洲精品久久久久久久久久 | 国产精品久久久久亚洲影视 | 国产亚洲精品久久久久久无几年桃 | 日韩免费成人 | 在线a视频 | 亚洲一区二区高潮无套美女 | 国产美女免费观看 | 波多野结衣一区二区三区中文字幕 | 五月婷婷在线视频 | 人人澡人人草 | 成年人天堂com | 韩国av电影在线观看 | 永久免费精品视频 | 手机av看片 | 国产中文在线播放 | 久久久电影 | 奇米影视777四色米奇影院 | 九九久久久 | 六月丁香婷婷网 | 美女免费电影 | 天天亚洲综合 | 久久久久久免费毛片精品 | 久久电影国产免费久久电影 | 成片视频在线观看 | 国产精品欧美久久久久久 | 国产黄色特级片 | 成人免费在线观看av | 亚洲最新av在线 | 日日夜夜精品免费 | 精品欧美一区二区在线观看 | 日韩av在线影视 | 天天操天天操天天爽 | 在线视频欧美日韩 | 人人澡人摸人人添学生av | 久久久这里有精品 | 干干干操操操 | 91在线视频在线 | 手机看片福利 | 九九热久久免费视频 | 91亚洲国产成人久久精品网站 | 不卡的av| 24小时日本在线www免费的 | 91黄色视屏 | 日韩精品免费在线 | 久久免费高清视频 | 中文字幕av免费观看 | 精品国产一区二区三区四 | 日批在线看 | 99视频一区 | 丁香六月久久综合狠狠色 | 四虎永久免费在线观看 | 天天操天天添 | 三级免费黄色 | 在线免费观看的av | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产黄色在线观看 | 天天操天天干天天爽 | 国产一区二区在线免费播放 | 久久久人 | 成人午夜电影在线观看 | 日批在线看| 亚洲欧洲精品久久 | 国产成人在线播放 | 免费成人在线观看 | 亚洲欧美成人综合 | 韩国av永久免费 | 久久这里精品视频 | 天天综合网天天综合色 | 在线视频婷婷 | 国产精品资源 | 久久黄色网址 | 国产特级毛片 | 国产成人久久精品77777综合 | 日韩字幕 | 精品久久久网 | 免费在线激情视频 | 日韩毛片在线一区二区毛片 | 在线免费成人 | 国产破处在线播放 | 中文字幕日韩伦理 | 久久精品中文字幕一区二区三区 | 夜夜嗨av色一区二区不卡 | 亚洲丁香日韩 | 九九色视频 | 中文字幕高清免费日韩视频在线 | 精品视频99 | 日韩视频一 | av在线不卡观看 | 国产综合91| av资源免费在线观看 | 91九色国产视频 | 国产精品久久久一区二区 | 又紧又大又爽精品一区二区 | 色婷婷亚洲婷婷 | 国产一级二级在线观看 | 免费在线一区二区 | 91.dizhi永久地址最新 | 免费在线观看av片 | www.伊人网| 中文 一区二区 | 在线久热| 国产精品9区 | 在线免费观看视频一区二区三区 | 一级免费观看 | 98精品国产自产在线观看 | 成人h视频 | 国产精品美女久久久久久2018 | 国产一区二区三区高清播放 | 91精品视频在线免费观看 | 91免费日韩 | 天天干夜夜爽 | 国产精品亚州 | 成人四虎 | 国产在线综合视频 | 91最新视频在线观看 | 国产福利91精品一区 | 色片网站在线观看 | 日韩欧美一区二区三区黑寡妇 | 天堂在线视频免费观看 | 欧美人交a欧美精品 | 在线电影中文字幕 | 国产精品久久久久久久久久了 | 怡红院av久久久久久久 | 色网站在线免费观看 | 婷婷色综 | 99色在线播放 | 人人插人人做 | 国产精品福利无圣光在线一区 | 国产99视频在线观看 | 五月婷激情 | 香蕉视频在线免费 | 日日夜夜精品免费观看 | 中文字幕欧美激情 | 久久久精品国产免费观看一区二区 | 啪啪资源 | 探花在线观看 | 日日夜夜噜噜噜 | 久操视频在线观看 | 日韩在线免费观看视频 | 婷婷丁香国产 | 欧美色综合久久 | 国产视频一区二区三区在线 | 久草在线视频看看 | 青青网视频 | 久久这里只有精品23 | 久久精彩视频 | 丁香在线观看完整电影视频 | 91视频在线免费观看 | www.888.av| 在线观看v片 | 国产精品久久久久久爽爽爽 | 六月色丁 | 亚洲欧洲日韩 | 精品av网站 | 天天插狠狠干 | 成人在线免费小视频 | 人人狠狠综合久久亚洲 | 天天射,天天干 | 99色在线播放 | a在线播放| 欧美激情视频一区二区三区 | www.97色.com| 久久综合一本 | 人人爱在线视频 | 久久精品日韩 | 国产成人性色生活片 | 亚洲理论在线观看电影 | 国产午夜精品理论片在线 | 久久国产精品久久精品国产演员表 | 24小时日本在线www免费的 | 99re6热在线精品视频 | 欧美日韩高清一区 | 免费国产在线视频 | 婷婷性综合 | 黄网站色 | 日韩理论视频 | 三级动图 | 成人国产网站 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 9色在线视频 | 亚洲va欧美va人人爽 | 久草在线免 | 九九日韩| 日韩欧美国产激情在线播放 | 午夜精品一区二区三区可下载 | 夜夜躁狠狠躁日日躁视频黑人 | 国产黄色精品网站 | 一区二区 不卡 | 久久久精品午夜 | 久久婷婷激情 | 国产精品国产三级国产专区53 | 精品国产aⅴ麻豆 | 免费69视频 | 玖玖玖国产精品 | 亚洲综合在线一区二区三区 | 久久综合九色99 | 欧美a视频在线观看 | 国产精品久久久久久久久久新婚 | 国产精品视频久久久 | 欧美一区二区三区在线播放 | 日韩理论在线观看 | 狠狠干夜夜操 | 日韩在线小视频 | 日韩欧美不卡 | 欧美日韩国产综合一区二区 | 五月天天av| 天天操夜操 | 黄色国产高清 | 国产69精品久久app免费版 | 欧美 另类 交 | 亚洲一二区视频 | 色999精品| 亚洲美女视频网 | 伊人久久五月天 | 国产精品久久久久久一二三四五 | 99精品国产成人一区二区 | 亚洲精品在线二区 | 狠狠干激情 | 亚洲国产免费网站 | 色综合久久精品 | 国产精品第52页 | 国产免费观看高清完整版 | 日韩精品免费一区二区三区 | 亚洲精品在线播放视频 | 国产一区二区在线免费播放 | 91看片网址 | 国产资源在线免费观看 | 精品亚洲网 | 亚洲丝袜一区 | 中文字幕一区二区三 | 国产精品黄色在线观看 | 免费又黄又爽的视频 | 亚州国产视频 | 天天色中文 | 99精品一区 | 日本久久99 | 久久久久黄 | 九九交易行官网 | 日日综合 | 久久久在线免费观看 | 免费在线色电影 | 欧美夫妻生活视频 | 国产精品免费高清 | 免费污片 | 免费观看国产成人 | 亚洲人在线视频 | 日韩午夜在线 | 日韩精品不卡在线观看 | 亚洲精欧美一区二区精品 | 国产又黄又爽无遮挡 | 国精产品一二三线999 | 精品美女在线观看 | 国产精品毛片久久久久久久 | 欧美一区二区日韩一区二区 | 成人免费 在线播放 | 亚洲高清视频在线观看免费 | 国产高清黄色 | 国产黄在线免费观看 | 日韩成人黄色av | 国产国语在线 | 中文字幕第一页在线 | 99精品视频在线观看 | 欧美精品久久久久久久久久 | 91桃色视频 | 国产精品一区二区三区四 | www欧美xxxx | 99热都是精品 | 黄色成人av| 麻豆视频一区二区 | 国产伦精品一区二区三区四区视频 | 国产精品成人久久久久久久 | 超级碰视频| 欧美激情奇米色 | 亚洲精品综合一二三区在线观看 | av一区二区在线观看中文字幕 | 欧美色插 | 91在线国内视频 | 国产精品久99 | 婷婷五月情 | 亚州av免费 | 99色99| 久久久精品电影 | www..com黄色片| 在线播放精品一区二区三区 | 欧美日韩性生活 | 亚洲精品久久视频 | 成年人免费电影 | 精品国产精品一区二区夜夜嗨 | 人人干人人爽 | 国内精品在线观看视频 | 91av视频在线免费观看 | 9热精品 | www亚洲一区 | 亚洲 精品在线视频 | 不卡国产在线 | 99热这里只有精品国产首页 | 国产福利在线 | 丰满少妇在线观看网站 | 92国产精品久久久久首页 | 日韩黄色一区 | 天天曰天天 | 免费在线观看污 | 久久久国产精品一区二区中文 | 久久国产精品精品国产色婷婷 | 天天综合网久久 | 97在线视| 狠狠插狠狠干 | 国产精品美女久久久久久 | 69亚洲乱 | 丝袜av网站 | 99精品视频网 | 狠狠狠操| 五月婷婷丁香综合 | 国产又黄又猛又粗 | 欧美一进一出抽搐大尺度视频 | 亚洲色图 校园春色 | 久久久精品小视频 | 日韩电影中文字幕在线观看 | 色99之美女主播在线视频 | 国产亚洲午夜高清国产拍精品 | 天天草天天| 亚洲视频456 | 国产精品一区久久久久 | 久久久www成人免费精品张筱雨 | 九九交易行官网 | 狠狠狠色丁香综合久久天下网 | 波多野结衣动态图 | 夜夜看av | 国产精品国产三级在线专区 | 99在线视频播放 | 黄色av影视 | 中文字幕丝袜制服 | 91丨九色丨丝袜 | 91禁在线观看 | 色综合天天干 | www在线观看视频 | 久久综合偷偷噜噜噜色 | 中文字幕乱码电影 | 日韩一级黄色大片 | 精品视频在线观看 | 成人免费网站视频 | 91亚洲精品国偷拍 | 久久99久久99久久 | 国产精品成久久久久 | 成人h动漫精品一区二 | www.888.av| 2019中文字幕网站 | 国产一区二区观看 | 国产精品精品久久久久久 | 国产色拍拍拍拍在线精品 | 国产精品女 | 99热精品国产一区二区在线观看 | 久久久久久久免费观看 | 国产精品成人免费精品自在线观看 | 午夜18视频在线观看 | 高清美女视频 | 中国一级片视频 | 精品亚洲一区二区三区 | 日韩美在线 | www.黄色片.com | 黄色软件网站在线观看 | 精品日韩视频 | 日日干日日色 | 欧美日韩国产精品一区 |