日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java学习笔记7-1——注解与反射

發布時間:2023/12/10 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java学习笔记7-1——注解与反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 注解
    • 注解是啥
    • 內置注解
    • 元注解
      • @Target
      • @Retention
      • @Documented
      • @Inherited
    • 自定義注解
  • 反射
    • 靜態語言 和 動態語言
    • Java 反射機制概述
    • Java 反射機制提供的功能
    • Java 反射優點和缺點
    • 反射相關的主要 API

注解

注解是啥

  • 注解(Annotation)是從 JDK 1.5 開始引入的新技術

Annotation 的作用:

  • 不是程序本身,可以對程序作出解釋(這一點和注釋沒什么區別)
  • 可以被其它程序(比如:編譯器等)讀取

Annotation 的格式:

  • 注解是以 “@注釋名” 在代碼中存在的,還可以添加一些參數值,例如:@SuppressWarnings(value=“unchecked”)

Annotation 在哪里使用?

  • 可以附加在 package,class,method,field等上面,相當于給他們添加了額外的輔助信息,我們可以通過反射機制編程實現對這些元數據的訪問

內置注解

  • @Override:定義在 java.lang.Override中,此注解只適用于修辭方法,表示一個方法聲明打算重寫超類中的另一個方法聲明
@Target(value=METHOD) @Retention(value=SOURCE) public @interface Override
  • @Deprecated:定義在 java.lang.Deprecated中,此注釋可以用于修辭方法,屬性,類,表示不鼓勵程序員使用這樣的元素,通常是因為它很危險或者存在更好的選擇
@Documented @Retention(value=RUNTIME) @Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE}) public @interface Deprecated
  • @SuppressWarnings:定義在 java.lang.SuppressWarings中,用來抑制編譯時的警告信息,與前兩個注釋有所不同,你需要添加一個參數才能正確使用,這些參數都是已經定義好了的,我們選擇性的使用就好了

@SuppressWarnings(“all”)
@SuppressWarnings(“unchecked”)
@SuppressWarnings(value={“unchecked”,“deprecation”})
等等…

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE}) @Retention(value=SOURCE) public @interface SuppressWarnings

元注解

  • 元注解的作用就是負責注解其它注解,Java 定義了 4 個標準的 meta-annotation 類型,它們被用來提供對其它注解類型做說明
  • 這些類型和它們所支持的類在 java.lang.annotation包中可以找到(@Target,@Retention,@Documented,@Inherited)

@Target

用于描述注解的作用域

@Target(ElementType.TYPE) // 接口、類、枚舉、注解 @Target(ElementType.FIELD) // 字段、枚舉的常量 @Target(ElementType.METHOD) // 方法 @Target(ElementType.PARAMETER) // 方法參數 @Target(ElementType.CONSTRUCTOR) // 構造函數 @Target(ElementType.LOCAL_VARIABLE) // 局部變量 @Target(ElementType.ANNOTATION_TYPE) // 注解 @Target(ElementType.PACKAGE) // 包

@Retention

表示需要在什么級別保存該注釋信息,用于描述注解的生命周期(SOURCE < CLASS < RUNTIME)

  • RetentionPolicy.SOURCE
    這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略,在class字節碼文件中不包含。
  • RetentionPolicy.CLASS
    這種類型的Annotations編譯時被保留,默認的保留策略,在class文件中存在,但JVM將會忽略,運行時無法獲得。
  • RetentionPolicy.RUNTIME
    這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其他使用反射機制的代碼所讀取和使用。

@Documented

說明該注解將被包含在 javadoc 中

@Inherited

說明子類可以繼承父類中的該注解

自定義注解

  • 使用 @interface 自定義注解時,自動繼承了java.lang.annotation.Annotation 接口

分析:

  • @interface 用來聲明一個注解,格式:public @interface 注解名 {定義內容}
  • 其中的每一個方法實際上是聲明了一個配置參數
  • 方法的名稱就是參數的名稱
  • 返回值類型就是參數的類型(返回值只能是基本類型,Class,String,enum)
  • 可以通過 default 來聲明參數的默認值
  • 如果只有一個參數成員,一般參數名為 value
  • 注解元素必須要有值,我們定義注解元素時,經常使用空字符串,0 作為默認值
public class Test01 { // 注解可以顯示賦值,如果沒有默認值,我們就必須給注解賦值@MyAnnotation(age = 18, name = "lisa")public void test() { }@DemoAnnotation("注解測試")public void test1() {} }@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation {// 注解的參數:參數類型 + 參數名()String name() default "";int age();// 如果默認值為 -1,代表不存在int id() default -1;String[] schools() default {"大學"}; }@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface DemoAnnotation {String value(); }

反射

反射的應用可以參考這篇詳細的文章Java反射機制的簡單使用

靜態語言 和 動態語言

動態語言
動態語言是一類在運行時可以改變其結構的語言:例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被刪除或是其它結構上的變化。通俗一點說就是在運行時代碼可以根據某些條件改變自身結構。如:Python、JavaScript、C#、PHP等

靜態語言
與動態語言相對應,運行時結構不可變的語言就是靜態語言,如 Java、C、C++

Java 不是靜態語言,但是 Java 可以稱之為 “準動態語言”。即 Java 有一定的動態性,我們可以利用反射機制獲得類似動態語言的特性。Java 的動態性讓編程的時候更加靈活

Java 反射機制概述

Reflection(反射)是 Java 被視為動態語言的關鍵,反射機制允許程序在執行期借助于 Reflection API 取得任何類的內部信息,并能直接操作任意對象的內部屬性以及方法

Class c = Class.forName("java.lang.String");

加載完類之后,在堆內存的方法區中就產生了一個 Class 類型的對象(一個類只有一個 Class 對象),這個對象就包含了完整類的類的結構信息。我們可以通過對這個對象看到的類的結構。這個對象就像一面鏡子,通過這個鏡子看到類的結構,所以,我們形象地稱之為:反射

正常方式:
引入需要的 “ 包類 ” 名稱 ——> 通過 new 實例化 ——> 取得實例化對象

反射方式(正常方式反過來):
實例化對象 ——> getClass() 方法 ——> 得到完整的 “包類” 名稱

Java 反射機制提供的功能

在運行時判斷任意一個對象所屬的類
在運行時構造任意一個類的對象
在運行時判斷任意一個類所具有的成員變量和方法
在運行時獲取泛型信息
在運行時調用任意一個對象的成員變量和方法
在運行時處理注解
生成動態代理

Java 反射優點和缺點

優點: 可以實現動態創建對象和編譯,體現出很大的靈活性

缺點: 對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴 JVM,我們希望做什么并且它滿足我們什么要求,這類操作總是慢于直接執行相同的操作

反射相關的主要 API

java.lang.Class 代表一個類
java.lang.reflect.Method 代表類的方法
java.lang.reflect.Field 代表類的成員變量
java.lang.reflect.Constructor 代表類的構造器

總結

以上是生活随笔為你收集整理的Java学习笔记7-1——注解与反射的全部內容,希望文章能夠幫你解決所遇到的問題。

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