日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java注解和反射,你學會了嗎?

來源: 責編: 時間:2024-01-18 09:39:36 226觀看
導讀注解注解(Annotation)是JDK5引入的一種代碼輔助工具,其核心作用是對類、方法、變量、參數和包進行標注,通過反射來訪問這些標注信息,以此在運行時改變所注解對象的行為,Java中的注解由內置注解和元注解組成。注解與注釋Ja

注解

注解(Annotation)是JDK5引入的一種代碼輔助工具,其核心作用是對類、方法、變量、參數和包進行標注,通過反射來訪問這些標注信息,以此在運行時改變所注解對象的行為,Java中的注解由內置注解和元注解組成。PF928資訊網——每日最新資訊28at.com

注解與注釋

  • Java注解又稱之為Java標注,是JDK5開始支持加入源代碼的特殊語法元數據
  • 普通的注釋在編譯后的class文件中是不存在的,而注解附加的信息則根據需要可以保存到class文件中,甚至運行期加載的class對象中

元注解介紹

創建注解

public @interface [AnnotationName]{}

元注解(描述注解的一種方式)

1.@Retention 定義注解的生命周期(source、class、runtime)
2.@Documented 文檔注解,會被javadoc工具文檔化
3.@Inherited 是否讓子類繼承該注解
4.@Target 描述注解的應用范圍,可選內容如下所示:PF928資訊網——每日最新資訊28at.com

  • TYPE:可以用來修飾類、接口、注解類型或枚舉類型
  • PACKAGE:可以用來修飾包
  • PARAMETER:可以用來修飾參數
  • ANNOTATION_TYPE:可以用來修飾注解類型
  • METHOD:可以用來修飾屬性
  • FIELD:可以用來修飾屬性(包括枚舉常量)
  • CONSTRUCTOR:可以用來修飾構造器
  • LOCAL_VARIABLE:可以用來修飾局部變量

創建使用注解示例

注解的創建方式:PF928資訊網——每日最新資訊28at.com

  1. 配置元注解,由元注解來聲明當前注解的作為范圍和聲明周期。
  2. 注解中如果需要添加信息,可以用以上方式添加。
  3. 注解信息支持java的基本數據結構。

1.創建注解 @StudyPF928資訊網——每日最新資訊28at.com

@Target({ElementType.FIELD, ElementType.TYPE}) // 元注解,定義注解的修飾范圍,可以設置多個@Retention(RetentionPolicy.RUNTIME) // 元注解,定義注解的聲明周期public @interface Study { // 注解內容可以設置值,也可以不設置值    // 其中的屬性是支持JAVA的八大屬性的 byte、short、int、long、float、double、boolean、char    // 如果屬性為value,那么使用時,賦值可以不寫 "value ="    String name() default "Neco Deng"; // 表示定義了一個name屬性,并且設置了默認值為Neco Deng    String[] mores(); // 表示定義了一個名字為mores的字符串數組屬性,并且沒有默認值,即該屬性需要顯示定義}

2.使用注解PF928資訊網——每日最新資訊28at.com

@Study(mores = {"first", "second"}) // 在類上使用注解,這里必須定義mores, 不然會報錯public class Person {    private int id;    @Study(mores = {"first", "second"}) // 在屬性上使用注解,這里必須定義mores, 不然會報錯    private String name;}

反射

反射(Reflection):在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為Java語言的反射。PF928資訊網——每日最新資訊28at.com

反射的優缺點

  • 通過反射可以使程序代碼訪問裝載到JVM中的類的內部信息,獲取已裝載類的屬性信息,獲取已裝載類的方法,獲取已裝載類的構造方法信息。
  • 反射提供了JAVA程序的靈活性和擴展性,降低耦合性,提高自適應能力。
  • 反射會對性能造成一定的影響,同時讓代碼的可讀性變低。

常用的反射API

方法名PF928資訊網——每日最新資訊28at.com

返回值PF928資訊網——每日最新資訊28at.com

參數描述PF928資訊網——每日最新資訊28at.com

Class.forName()PF928資訊網——每日最新資訊28at.com

獲取類的元信息PF928資訊網——每日最新資訊28at.com

當前類文件的具體位置PF928資訊網——每日最新資訊28at.com

clazz.getClass()PF928資訊網——每日最新資訊28at.com

獲取類的元信息PF928資訊網——每日最新資訊28at.com

PF928資訊網——每日最新資訊28at.com

clazz.getDeclaredFields()PF928資訊網——每日最新資訊28at.com

獲取當前類中的所有屬性PF928資訊網——每日最新資訊28at.com

當前類文件的具體位置PF928資訊網——每日最新資訊28at.com

setAccessible(true)PF928資訊網——每日最新資訊28at.com

設置當前屬性為可見PF928資訊網——每日最新資訊28at.com

true或falsePF928資訊網——每日最新資訊28at.com

getMethods()PF928資訊網——每日最新資訊28at.com

獲取類所有方法PF928資訊網——每日最新資訊28at.com

PF928資訊網——每日最新資訊28at.com

invoke(obj)PF928資訊網——每日最新資訊28at.com

通過反射執行方法PF928資訊網——每日最新資訊28at.com

類的元信息PF928資訊網——每日最新資訊28at.com

getAnnotation(class)PF928資訊網——每日最新資訊28at.com

獲取注解PF928資訊網——每日最新資訊28at.com

需要獲取到額注解的ClassPF928資訊網——每日最新資訊28at.com

例子

public class ReflectionDemo {    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException,            InstantiationException, NoSuchMethodException, InvocationTargetException {        // 實例1:通過反射獲取到Class元信息        Person person = new Person();        Class<? extends Person> aClass1 = person.getClass(); // 通過getClass獲取元信息        Class<?> aClass2 = Class.forName("com.model.Person"); // 通過forName獲取元信息        // 實例2:通過反射獲取類名,包名        String name = aClass1.getName(); // 全路徑類名 > cn.lazyfennec.model.Person        String simpleName = aClass1.getSimpleName(); // 不包含路徑 > Person        Package aPackage = aClass1.getPackage(); // 包名 > package cn.lazyfennec.model        System.out.println(name);        System.out.println(simpleName);        System.out.println(aPackage);        System.out.println("===============================");        // 實例3:獲取類屬性        Field[] declaredFields = aClass1.getDeclaredFields();        for (Field declaredField : declaredFields) {            System.out.println(declaredField);        }        // 實例4:獲取類屬性的具體的值        person.setId(1);        person.setName("Neco");        for (Field declaredField : declaredFields) {            declaredField.setAccessible(true); // 設置屬性可見可訪問,處理私有屬性無法訪問的問題            System.out.println(declaredField.get(person));        }        // 實例4的另一種寫法,只是簡單的寫法,可以進行優化        Object obj = aClass1.newInstance(); // 實例化一個新的對象, 相當于反射中的實例化        declaredFields = obj.getClass().getDeclaredFields();        for (Field declaredField : declaredFields) {            declaredField.setAccessible(true);            if (declaredField.getName().equals("name")) {                declaredField.set(obj, "Neco");            } else {                declaredField.set(obj, 1);            }            System.out.println(declaredField.get(obj));        }        // 實例5:反射獲取當前類的方法        Method[] methods = aClass1.getMethods();        for (Method method : methods) {            System.out.println(method.getName());        }        Method method = aClass1.getMethod("getString");        Object invoke = method.invoke(obj);        System.out.println(invoke);        // 實例6:反射獲得注解        Study study = aClass1.getAnnotation(Study.class); // 從類中獲取注解        System.out.println(study);        String[] mores = study.mores();        String name1 = study.name();        System.out.println("name: " + name1 + " mores: " + mores);        // 從方法上獲取注解        methods = aClass1.getDeclaredMethods();        for (Method method1 : methods) {            Study annotation = method1.getAnnotation(Study.class);            if (annotation == null) continue;            String name2 = annotation.name();            String[] mores1 = annotation.mores();            System.out.println("name: " + name2 + " mores: " + mores1);        }        // 從屬性上獲取注解        declaredFields = aClass1.getDeclaredFields();        for (Field declaredField : declaredFields) {            Study annotation = declaredField.getAnnotation(Study.class);            if (annotation == null) continue;            String annotationName = annotation.name();            String[] annotationMores = annotation.mores();            System.out.println("name: " + annotationName + " mores: " + annotationMores);        }    }}

參考

https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/index.htmlPF928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-64099-0.htmlJava注解和反射,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Gorm 框架原理&amp;源碼解析

下一篇: Jet Brains 2023 開發者生態系統現狀

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
Top 主站蜘蛛池模板: 寿宁县| 冷水江市| 株洲市| 和平区| 搜索| 彭水| 杭锦后旗| 凤庆县| 梅河口市| 台北县| 普兰店市| 汨罗市| 霸州市| 宁都县| 三亚市| 鄂托克旗| 都安| 尼勒克县| 大名县| 沽源县| 垫江县| 茂名市| 宜丰县| 方正县| 香格里拉县| 都昌县| 阳原县| 江孜县| 启东市| 新宾| 文昌市| 武夷山市| 元谋县| 张家口市| 永善县| 依兰县| 汝阳县| 文山县| 朔州市| 武义县| 岑巩县|