亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Kotlin中的反射機制深入講解

2024-07-21 23:03:50
字體:
來源:轉載
供稿:網友

前言

Java中的反射機制,使得我們可以在運行期獲取Java類的字節碼文件中的構造函數,成員變量,成員函數等信息。這一特性使得反射機制被常常用在框架中,想要比較系統的了解Kotlin中的反射,先從Java的反射說起。

Java中的反射

通常我們寫好的.java源碼文件,經過javac的編譯,最終生成了.class字節碼文件。這些字節碼文件是與平臺無關的,使用時通過Classloader去加載這些.class字節碼文件,從而讓程序按照我們編寫好的業務邏輯運行。Java的反射主要是從這些.class文件中獲取我們想要得到的內容,那么Java中的反射能夠得到哪些內容呢?

獲取Class對象

Java是面向對象的語言,同樣的.class字節碼文件也不例外,想要獲取.class文件中的內容,就要先獲取.class文件對應的Class對象。Java中獲取Class對象的方式有三種。

//1.Class.forName("類名字符串") (注意:類名字符串必須是全稱,包名+類名)Class baseInfo = Class.forName("top.sguotao.ReflectionJava"); //2.類名.classClass object = Object.class;//3.實例對象.getClass()Class date = (new Date()).getClass();Class testclass = this.getClass();

獲取類的構造函數Constructor

獲取Class對象之后,就可以獲取其中的構造函數,從而去創建實例對象。類的構造函數對應java.lang.reflect.Constructor。獲取構造函數歸納起來有以下五種方式:

 // 1.獲取參數列表是parameterTypes,訪問控制符是public的構造函數 public Constructor getConstructor(Class[] parameterTypes) // 2.獲取所有訪問控制符是public的構造函數 public Constructor[] getConstructors() // 3.獲取參數列表是parameterTypes,并且是類自身聲明的構造函數,訪問控制符包含public、protected和private的函數。 public Constructor getDeclaredConstructor(Class[] parameterTypes) //4.獲取類自身聲明的全部的構造函數,訪問控制符包含public、protected和private的函數。 public Constructor[] getDeclaredConstructors() //5.如果類聲明在其它類的構造函數中,返回該類所在的構造函數,如果存在則返回,不存在返回null public Constructor getEnclosingConstructor()

獲取類的成員變量

類的成員變量對應的是java.lang.reflect.Field,獲取成員變量歸納起來有以下四種方式:

 //1.獲取“名稱是name”的public的成員變量(包括從基類繼承的、從接口實現的所有public成員變量) public Field getField(String name) //2.獲取全部的public成員變量(包括從基類繼承的、從接口實現的所有public成員變量) public Field[] getFields() //3.獲取“名稱是name”,并且是類自身聲明的成員變量,包含public、protected和private成員變量。 public Field getDeclaredField(String name) //4.獲取全部的類自身聲明的成員變量,包含public、protected和private成員變量。 public Field[] getDeclaredFields()

獲取類的成員函數

類的成員函數對應的是java.lang.reflect.Method,獲取成員函數歸納起來有下面5種方式:

// 1.獲取函數名是name,參數是parameterTypes的public的函數(包括從基類繼承的、從接口實現的所有public函數) public Method getMethod(String name, Class[] parameterTypes) //2.獲取全部的public的函數(包括從基類繼承的、從接口實現的所有public函數) public Method[] getMethods() //3.獲取函數名name,參數是parameterTypes,并且是類自身聲明的函數,包含public、protected和private方法。 public Method getDeclaredMethod(String name, Class[] parameterTypes) //4.獲取全部的類自身聲明的函數,包含public、protected和private方法。 public Method[] getDeclaredMethods() //5.如果這個類是其它類中某個方法的內部類,調用getEnclosingMethod()就是這個類所在的方法;若不存在,返回null。 public Method getEnclosingMethod()

獲取類的其它信息

獲取類的注解信息,對應的是java.lang.annotation.Annotation接口,獲取類的注解信息歸納起來有下面3種方法:

//1.獲取類的annotationClass類型的注解 (包括從基類繼承的、從接口實現的所有public成員變量)public Annotation<A> getAnnotation(Class annotationClass)//2.獲取類的全部注解 (包括從基類繼承的、從接口實現的所有public成員變量)public Annotation[] getAnnotations()//3.獲取類自身聲明的全部注解 (包含public、protected和private成員變量)public Annotation[] getDeclaredAnnotations()

獲取類的接口和基類的信息,對應的是java.lang.reflect.Type接口,獲取類的接口和基類信息有下面兩個方法:

 // 獲取實現的全部接口public Type[] getGenericInterfaces()// 獲取基類public Type getGenericSuperclass()

獲取類的其它描述信息。

 //1.獲取類名 public String getSimpleName() //2.獲取完整類名 public String getName() //3.判斷類是不是枚舉類 public boolean isEnum() //4.判斷obj是不是類的實例對象 public boolean isInstance(Object obj) //5.判斷類是不是接口 public boolean isInterface() //6.判斷類是不是本地類,所謂本地類,就是定義在方法內部的類。 public boolean isLocalClass() //7.判斷類是不是成員類,所謂成員類,就是常見的內部類,是指不在代碼塊,構造函數和成員方法中的內部類。 public boolean isMemberClass() //8.判斷類是不是基本類型。 基本類型,包括void和boolean、byte、char、short、int、long、float 和 double這幾種類型。 public boolean isPrimitive()

Kotlin中的反射

在Kotlin中,字節碼對應的類是kotlin.reflect.KClass,因為Kotlin百分之百兼容Java,所以Kotlin中可以使用Java中的反射,但是由于Kotlin中字節碼.class對應的是KClass類,所以如果想要使用Java中的反射,需要首先獲取Class的實例,在Kotlin中可以通過以下兩種方式來獲取Class實例。

//1.通過實例.javaClassvar hello = HelloWorld()hello.javaClass //2.通過類Kclass類的.java屬性HelloWorld::class.java

獲取了Class實例,就可以調用上面介紹的方法,獲取各種在Java中定義的類的信息了。

當然Kotlin中除了可以使用Java中的反射以外,還可以使用Kotlin中聲明的一些方法,當然同Java中反射一樣,想要使用這些方法,先要獲取Kclass對象,在Kotlin中可以通過以下兩種方式獲取Kclass實例。

 //1.通過類::class的方式獲取Kclass實例val clazz1: KClass<*> = HelloWorld::class//2.通過實例.javaClass.kotlin獲取Kclass實例var hello = HelloWorld()val clazz2 = hello.javaClass.kotlin

獲取了Kclass實例之后,就可以調用Kotlin中聲明的一些關于反射的方法了,那么都有哪些方法呢?

構造函數Constructor

Kotlin可以通過下面的方法,獲取所有的構造函數。

//返回這個類的所有構造器public val constructors: Collection<KFunction<T>>

成員變量和成員函數

Kotlin中獲取成員變量和成員函數的方法有6個。

 //返回類可訪問的所有函數和屬性,包括繼承自基類的,但是不包括構造器 override val members: Collection<KCallable<*>> //返回類聲明的所有函數 val KClass<*>.declaredFunctions: Collection<KFunction<*>> //返回類的擴展函數 val KClass<*>.declaredMemberExtensionFunctions: Collection<KFunction<*>> //返回類的擴展屬性 val <T : Any> KClass<T>.declaredMemberExtensionProperties: Collection<KProperty2<T, *, *>> //返回類自身聲明的成員函數 val KClass<*>.declaredMemberFunctions: Collection<KFunction<*>> //返回類自身聲明的成員變量(屬性) val <T : Any> KClass<T>.declaredMemberProperties: Collection<KProperty1<T, *>>

類相關信息

可以看到Kotlin反射中,可以獲取比Java反射更多的關于類的信息。

//1.返回類的名字public val simpleName: String? //2.返回類的全包名public val qualifiedName: String?//3.如果這個類聲明為object,則返回其實例,否則返回nullpublic val objectInstance: T?//4.返回類的可見性@SinceKotlin("1.1")public val visibility: KVisibility?//5.判斷類是否為final類(在Kotlin中,類默認是final的,除非這個類聲明為open或者abstract)@SinceKotlin("1.1")public val isFinal: Boolean//6.判斷類是否是open的(abstract類也是open的),表示這個類可以被繼承@SinceKotlin("1.1")public val isOpen: Boolean//7.判斷類是否為抽象類@SinceKotlin("1.1")public val isAbstract: Boolean//8.判斷類是否為密封類,密封類:用sealed修飾,其子類只能在其內部定義@SinceKotlin("1.1")public val isSealed: Boolean//9.判斷類是否為data類@SinceKotlin("1.1")public val isData: Boolean//10.判斷類是否為成員類@SinceKotlin("1.1")public val isInner: Boolean//11.判斷類是否為companion object@SinceKotlin("1.1")public val isCompanion: Boolean //12.返回類中定義的其他類,包括內部類(inner class聲明的)和嵌套類(class聲明的)public val nestedClasses: Collection<KClass<*>> //13.判斷一個對象是否為此類的實例@SinceKotlin("1.1")public fun isInstance(value: Any?): Boolean//14.返回這個類的泛型列表@SinceKotlin("1.1")public val typeParameters: List<KTypeParameter>//15.類其直接基類的列表@SinceKotlin("1.1")public val supertypes: List<KType>//16.返回類所有的基類val KClass<*>.allSuperclasses: Collection<KClass<*>>//17.返回類的伴生對象companionObjectval KClass<*>.companionObject: KClass<*>?

使用Kotin中反射注意的問題

在Kotlin1.1中如果反射String,Map,List等類型時,會拋出一個built-in Kotlin Types的異常,這是因為在Kotlin1.1版本中還沒有對這些類型添加支持,在Kotlin1.2版本中,這個問題已經解決。

Kotlin關于反射的內容都放在kotlin-reflect的jar包中,這個jar包有2.6M,對于移動端開發,需要占用一定的內存空間。

最后就是關于Kotlin反射的效率問題,在Java中反射大概需要幾十微秒,在Kotlin就需要幾百甚至上千微秒,如果是通過反射訪問對象或構造屬性,甚至需要上萬微秒,對此,官方給出的解釋是,現在還沒有精力進行優化,相信后續的版本中,效率問題會有所改善。

參考鏈接

  • Kotlin Bootcamp for Programmers
  • Kotlin Koans

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一区二区三区婷婷月| 亚洲精品久久久久久久久久久久| 91精品在线播放| 亚洲欧洲中文天堂| 视频在线观看99| 日韩精品在线视频| 国产亚洲一区二区在线| 国产精品三级美女白浆呻吟| 欧美交受高潮1| 96精品久久久久中文字幕| 久久这里只有精品视频首页| 精品亚洲男同gayvideo网站| 国产精品美腿一区在线看| 国产精品成人一区二区| 久久国产精品99国产精| 5566成人精品视频免费| 日韩成人网免费视频| 国产精品白丝av嫩草影院| 亚洲黄色av网站| 96pao国产成视频永久免费| 成人性生交大片免费看视频直播| 国产女精品视频网站免费| 国产精品亚洲片夜色在线| 欧美国产高跟鞋裸体秀xxxhd| 这里只有精品丝袜| 中文字幕欧美日韩精品| 中文字幕成人精品久久不卡| 亚洲第一精品夜夜躁人人躁| 亚洲午夜未满十八勿入免费观看全集| 日本不卡视频在线播放| 激情成人中文字幕| 在线成人中文字幕| 成人精品视频99在线观看免费| 欧美精品www在线观看| 国产精品入口日韩视频大尺度| 欧美日韩在线视频观看| 精品在线欧美视频| 精品高清美女精品国产区| 久久人人97超碰精品888| 国产精品嫩草影院久久久| 8x拔播拔播x8国产精品| 日韩精品中文字| 亚洲aa中文字幕| 国产精品影院在线观看| 精品视频在线观看日韩| 91精品国产91| 日韩精品欧美国产精品忘忧草| 午夜精品视频在线| 奇米一区二区三区四区久久| 欧美色图在线视频| 欧美成人精品在线视频| 国产91色在线免费| 日韩欧美国产成人| 欧美日韩国产一区中文午夜| 日本久久中文字幕| 亚洲免费伊人电影在线观看av| 欧美性色xo影院| 日韩欧美亚洲成人| 国产女人精品视频| 亚洲欧洲av一区二区| 国产亚洲欧洲在线| 欧美黑人xxx| 亚洲欧美www| 国产精品视频免费在线观看| 欧美网站在线观看| 北条麻妃久久精品| 人体精品一二三区| 日韩av在线导航| 国产精品99久久99久久久二8| 国内精品中文字幕| 国产99视频精品免视看7| 亚洲丝袜一区在线| 亚洲片在线观看| 亚洲视频在线免费观看| 久久久www成人免费精品| 国产不卡在线观看| 国产成人aa精品一区在线播放| 狠狠久久亚洲欧美专区| 日韩一区二区在线视频| 亚洲精品欧美日韩专区| 91精品国产色综合久久不卡98| 国产91热爆ts人妖在线| 自拍偷拍亚洲区| 色老头一区二区三区在线观看| 亚洲欧美成人一区二区在线电影| 久久亚洲精品国产亚洲老地址| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美国产日韩一区二区在线观看| 日韩在线视频观看正片免费网站| 亚洲成人av资源网| 美女性感视频久久久| 亚洲精品国产精品乱码不99按摩| 自拍亚洲一区欧美另类| 亚洲黄色在线观看| 日韩精品视频在线| 欧美日韩福利视频| 成人福利在线视频| 欧美孕妇孕交黑巨大网站| 久久综合伊人77777蜜臀| 亚洲91精品在线观看| 亚洲少妇激情视频| 精品成人69xx.xyz| 国产精品第100页| 亚洲成人免费在线视频| 国产欧美欧洲在线观看| 欧美日本在线视频中文字字幕| 粗暴蹂躏中文一区二区三区| 久久久亚洲国产天美传媒修理工| 国产精品欧美风情| 国产精品r级在线| 国产精品男人的天堂| 亚洲国产高清高潮精品美女| 欧美日韩成人在线播放| 亚洲国语精品自产拍在线观看| 精品露脸国产偷人在视频| 国产精品美女免费视频| 国产成人精品av在线| 国产aaa精品| 正在播放亚洲1区| 国产精品中文字幕在线| 国产一区在线播放| 精品久久久久久久久久久久久久| 久久久亚洲国产天美传媒修理工| 黑人巨大精品欧美一区二区| 国产精品美女无圣光视频| 欧美夜福利tv在线| 国a精品视频大全| 91成人在线观看国产| 26uuu日韩精品一区二区| 欧美肥臀大乳一区二区免费视频| 91精品国产91久久久久久吃药| 国产精品高清免费在线观看| 久久久久久噜噜噜久久久精品| 久久婷婷国产麻豆91天堂| 78m国产成人精品视频| 欧美日韩成人精品| 国产精品视频午夜| 97热精品视频官网| 亚洲第一区第一页| 欧美日韩中文在线观看| 日韩精品高清在线| 2019亚洲男人天堂| 日韩激情av在线播放| 日本高清不卡的在线| 日韩在线资源网| 国产日韩欧美中文在线播放| 97久久精品视频| 裸体女人亚洲精品一区| 久久精视频免费在线久久完整在线看| 亚洲男人av在线| 久热在线中文字幕色999舞| 日韩成人av一区| 成人激情视频在线| 久久91亚洲精品中文字幕| 欧美猛交免费看| 精品国产乱码久久久久久虫虫漫画| 欧美日韩福利视频| 国产精品一区二区久久精品| 97人人爽人人喊人人模波多| 亚洲va男人天堂| 国产精品va在线播放| 中文亚洲视频在线| 国产mv免费观看入口亚洲| 中文字幕综合一区|