注解在java-1.5版本中引入的蔑水;
注解提供了一種原程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)的途徑和方法挣输;
Paste_Image.png
一.java中的常見注解( JDK自帶的注解 )
- @Override 代表子類實(shí)現(xiàn)父類的方法(注意:只要有該注解僚害,父類必須定義該方法喉脖,否則子類會報錯)
- @Deprecated() 如果父類或接口的某個方法發(fā)現(xiàn)以后不用了此再,但是之前繼承該類的子類可能還在使用饵较,所以不能直接刪除,要使用
@Deprecated()
注解表示該方法已過時, 這時在子類實(shí)例化后使用該方法的時候镐捧,會產(chǎn)生警告信息潜索,可以使用SuppressWarnings("desc")
忽略編輯器的警告
Paste_Image.png
二.注解的分類
Paste_Image.png
- 源碼注解: 注解只在源碼中存在,編譯為class后注解就消失了,比如(@Override, @Deprecated,SuppressWarnings("desc"))
- 編譯時注解: 注解在源碼和class文件中都存在
- 運(yùn)行時注解: 注解在運(yùn)行階段依然起作用懂酱,甚至?xí)绊戇\(yùn)行時的邏輯
- 元注解:注解的注解
三.自定義注解
Paste_Image.png
Paste_Image.png
-
使用自定義注解:
Paste_Image.png - 新建annotation注解
package comments;
/*
* 自定義注解
*/
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
* 元注解:注解的注解
*/
//注解的作用域竹习,方法和類/接口
@Target({ ElementType.METHOD, ElementType.TYPE })
//注解的聲明周期,在運(yùn)行時起作用
@Retention(RetentionPolicy.RUNTIME)
//允許子類繼承父類的注解列牺,但不允許子類方法繼承父類方法的注解
@Inherited
//生成javadoc時會包含注解
@Documented
public @interface Description {
//成員以無參無異常的方式聲明
String desc();
String author();
int age() default 18;
}
- 在其他類中使用注解
package comments;
public class Child implements People {
@Override
@Description(author = "liangxifeng", desc = "獲取人員姓名")
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
- 注解只有一個成員
public @interface Description {
String value();
}
@Description("只有一個成員的使用")
- 注解無成員
public @interface Description {
}
@Description()
四.解析注解
- 通過反射獲取類整陌,函數(shù)或成員上的
運(yùn)行時
注解信息,從而實(shí)現(xiàn)動態(tài)控制程序運(yùn)行的邏輯瞎领; - 在Child類中使用以上自定義的注解
@Description(author="liangxifeng", desc="我是Child類", age=28)
public class Child implements People {
@Override
@Description(author="lxf", desc="我是Child類中的getName方法")
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
- ParseAnn類中獲取Child類中的類注解和方法注解信息
package comments;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* 解析注解
* @author lxf
*
*/
public class ParseAnn {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
//1. 使用類加載器加載類
Class c = Class.forName("comments.Child");
//2.找到類上面的注解
boolean isExit = c.isAnnotationPresent(Description.class);
//3.拿到注解實(shí)例
if(isExit)
{
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.age());//輸出:28
}
//4.找到方法上的注解
Method[] ms = c.getMethods();
for (Method method : ms) {
boolean isExitM = method.isAnnotationPresent(Description.class);
if(isExitM)
{
Description d = (Description) method.getAnnotation(Description.class);
System.out.println(d.author()); //輸出:lxf
}
}
//4.另外一種找到方法上的注解
for (Method m : ms) {
//獲取所有注解
Annotation[] as = m.getAnnotations();
for(Annotation a : as)
{
if( a instanceof Description )
{
Description d = (Description)a;
System.out.println(d.author()); //輸出:lxf
}
}
}
}
}
五.總結(jié)
Paste_Image.png