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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java的注解_java-注解相关

發布時間:2025/3/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java的注解_java-注解相关 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注解

概念:說明程序的,給計算機看

注釋:用文字描述程序

先了解一些怎么正常javadoc文檔

1:給類或者方法添加doc注釋

2:通過命令javadoc 執行 類.java文件

新建的類:

/*** 注解doc演示

*@authorquan

*@sincejdk 1.7

*@version1.8*/

public classAnnotation {/*** 計算兩個數的和

*@parama 整數

*@paramb 整數

*@return兩束的和*/

public int dd(int a,intb){return a+b;

}

}

快捷鍵:

在類的所在的文件夾里面

shift+右鍵就能在這個路徑下打開命令行

執行命令

查看生成的api文件

JDK種預定義的一些注解

沒加入SupperssWarning的時候:

會出現一些告警

自定義注解

格式

public @interface 注解名稱

本質: 注解的本質就是一個接口,改接口默認繼承Annotation接口

PS C:\Users\quan\Desktop\date>javac .\Myannotation.java

PS C:\Users\quan\Desktop\date> javap .\MyAnnotation.classCompiled from"Myannotation.java"

public interface MyAnnotation extendsjava.lang.annotation.Annotation {

}

屬性:接口種可以定義的成員的方法

要求:

屬性的只能返回值類型:基本數據類型 String 枚舉 注解 以及他們的數組

定義了屬性,在使用時需要給定屬性的值

如果定義屬性的時候,利用default關鍵字給定屬性初始值,則使用注解時可以不賦值

如果只有一個屬性需要賦值,并且屬性名稱時value,則value可以升序,直接定義值即可

數組賦值時,值使用大括號包裹,如果數組之喲一個值,大括號可以不寫

枚舉類:

public enumPersonE {

p1,p2,p3;

}

自定義注解:

public @interfaceMyAnnotation {//抽象方法

public String show() default "ALL";public intage();publicString[] str();publicPersonE p();

}

使用自定義注解:

@MyAnnotation(show = "quan",age = 12,str = {"quan","zhi"},p=PersonE.p1)public voiddemo(){

}

元注解

用于描述注解的注解:

Target

/*ElementType的取值

TYPE:可以作用類上

METHOD:可以作用方法上

FIELD:可以作用與成員變量上*/

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示該MyAnnoT注解只能作用與類上

public @interfaceMyAnnoT {

}

Retention

返回值時枚舉類:

/*@Retention(RetentionPolicy.RUNTIME )當前白描述的注解,會保留到class字節碼文件中國,并被JVM讀取到*/

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示該MyAnnoT注解只能作用與類上

@Retention(RetentionPolicy.RUNTIME )public @interfaceMyAnnoT {

}

Documented

@Documented//表示,未來會集合到javadoc文檔種

Inherited

@Inherited//表示是否會被繼承

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示該MyAnnoT注解只能作用與類上

@Retention(RetentionPolicy.RUNTIME )

@Documented//表示,未來會集合到javadoc文檔種

@Inherited//表示是否會被繼承

public @interfaceMyAnnoT {

}

在程序中實際應用注解,解析注解

獲取注解中定義中的屬性值

定義一個注解:

/*** 描述需要執行的類名和方法名*/@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)public @interfacePro {

String className();

String methodName();

}/*public class ProImpl implements Pro{

String className(){

return "annotaion.Demo1";

}

String methodName(){

retun "show";

}

}

定義一個類:

packageannotaion;public classDemo1 {public voidshow(){

System.out.println("demo1..show...");

}

}

定義一個使用注解的累

@Pro(className = "annotaion.Demo1",methodName = "show")public classReflectTest {public static void main(String[] args) throwsException {/*不能改變框架的任何代碼

可以創建任意類的對象,可以執行任意方法*/

//111解析注解:獲取該類的字節碼文件對象

Class reflectTestClass = ReflectTest.class;//222獲取上邊的注解//其實上面就是在內存中生成一個該注解接口子類實現對象

Pro an = reflectTestClass.getAnnotation(Pro.class);/*public class ProImpl implements Pro{

String className(){

return "annotaion.Demo1";

}

String methodName(){

retun "show";

}

}*/

//333調用注解對象中的抽象方法,獲取放回值

String className =an.className();

String methodName=an.methodName();//利用Class的靜態方法forName,傳入全類名去獲取指定類的Class對象

Class cls =Class.forName(className);

System.out.println(cls);//class annotaion.Demo1//通過Class對象的newInstance去實現無參實體類

Demo1 obj1 = (Demo1) cls.newInstance();//這里使用類的強制轉換

obj1.show();

System.out.println(obj1);//annotaion.Demo1@61bbe9ba

Object obj= cls.newInstance();//因為這里使用Object接受,多態。

System.out.println(obj);//annotaion.Demo1@61bbe9ba//通過Class對象去獲取類的方法

Method method =cls.getMethod(methodName);

System.out.println(method);//public void annotaion.Demo1.show()//執行方法,指定執行的實體類

method.invoke(obj);

}

}

re:

classannotaion.Demo1

demo1..show...

annotaion.Demo1@61bbe9ba

annotaion.Demo1@610455d6public voidannotaion.Demo1.show()

demo1..show...

計算器檢測bug案例

需要測試下面這個計算器有沒有bug

packageannotationDemo;public classCalulator {

@Checkpublic voidadd(){

String str= null;

str.toString();

System.out.println("1 + 0 = " +(1 + 0));

}

@Checkpublic voidsub(){

System.out.println("1 - 0 = " + (1 - 0));

}

@Checkpublic voidmul(){

System.out.println("1 * 0 = " + (1 * 0));

}

@Checkpublic voiddiv(){

System.out.println("1 / 0 = " + (1 / 0));

}public voidshow(){

System.out.println("no bug");

}

}

定義一個注解去實現:

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)public @interfaceCheck {

}

程序中利用注解:

importjava.io.BufferedOutputStream;importjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;/*** 簡單測試

* 主方法執行,會制動執行被加了注解的方法,判斷方法是否有異常

* 將異常記錄到文件當中*/

public classTestCheck {public static void main(String[] args) throwsIOException {//實體類

Calulator c = newCalulator();//2獲取字節碼文件對象

Class cls =c.getClass();//3獲取所有方法

Method[] methods =cls.getMethods();int number = 0;//出現異常的次數//異常記錄數據

BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));//4判斷方法中是否有Check注釋

for(Method method : methods) {if(method.isAnnotationPresent(Check.class)){try{

method.invoke(c);

}catch(Exception e) {//6捕獲異常

number++;

bw.write(method.getName()+ "方法出異常了");

bw.newLine();

bw.write("異常名稱: " +e.getCause().getClass().getSimpleName());

bw.newLine();

bw.write("異常原因: " +e.getCause().getMessage());

bw.newLine();

bw.write("~~~~~~~~~~~~~~~~~~~~~");

bw.newLine();//記錄到文件里面

}

}

}

bw.write("一共 " + number + "個異常");

bw.flush();

bw.close();

}

}

結果生成的bug.txt

總結

以上是生活随笔為你收集整理的java的注解_java-注解相关的全部內容,希望文章能夠幫你解決所遇到的問題。

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