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-注解相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 织梦自定义图片字段和缩略图一样_织梦图片
- 下一篇: 第五人格维修服务器时间,第五人格调整维护