成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
注解(Annotation)是JDK5引入的一種代碼輔助工具,其核心作用是對類、方法、變量、參數和包進行標注,通過反射來訪問這些標注信息,以此在運行時改變所注解對象的行為,Java中的注解由內置注解和元注解組成。

注解

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

注解與注釋

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

元注解介紹

創建注解

public @interface [AnnotationName]{}

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

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

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

創建使用注解示例

注解的創建方式:

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

1.創建注解 @Study

@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.使用注解

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

    private int id;

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

}

反射

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

反射的優缺點

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

常用的反射API

方法名

返回值

參數描述

Class.forName()

獲取類的元信息

當前類文件的具體位置

clazz.getClass()

獲取類的元信息

clazz.getDeclaredFields()

獲取當前類中的所有屬性

當前類文件的具體位置

setAccessible(true)

設置當前屬性為可見

true或false

getMethods()

獲取類所有方法

invoke(obj)

通過反射執行方法

類的元信息

getAnnotation(class)

獲取注解

需要獲取到額注解的Class

例子

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.html

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2024-11-08 08:56:01

2022-08-29 08:05:44

Go類型JSON

2024-01-19 08:25:38

死鎖Java通信

2022-12-22 08:14:54

2024-04-28 08:24:27

分布式架構Istio

2024-10-09 07:40:43

2022-09-26 11:03:25

Java反射漏洞

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2023-01-28 09:50:17

java多線程代碼

2023-07-10 08:36:21

工具pptword

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2023-01-30 09:01:54

圖表指南圖形化

2024-07-31 08:39:45

Git命令暫存區

2023-12-12 08:02:10

2022-07-08 09:27:48

CSSIFC模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品视频一区二区三区 | 精品一二区 | 免费在线观看av网址 | 国产精品美女久久久av超清 | 美女爽到呻吟久久久久 | av在线亚洲天堂 | 欧美 日韩 国产 成人 | 国产成人精品一区二区三区四区 | 欧美一级免费 | 99re国产视频 | 午夜免费影视 | 国产电影一区二区在线观看 | 亚洲aⅴ一区二区 | 狠狠艹| 国产精品免费一区二区三区 | 欧美日韩亚洲一区 | 五月天天丁香婷婷在线中 | 91精品无人区卡一卡二卡三 | 夜夜撸av| 一级黄片一级毛片 | 久久久久免费 | 国产美女一区二区 | 国产日韩欧美中文 | 国产精品久久久久久亚洲调教 | 在线观看av网站 | 欧美黑人体内she精在线观看 | 成人精品一区二区三区中文字幕 | 五月激情综合网 | 国产日韩欧美一区二区 | 一区二区在线观看av | 欧美视频三级 | 久久精品国产久精国产 | 天堂久久av| 91久久精品国产 | 91网视频| 久久99国产精一区二区三区 | 一区二区三区免费观看 | 色吊丝在线 | 亚洲综合色丁香婷婷六月图片 | 夜夜艹| 中文字幕在线精品 |