public @interface SomeAnotation{
}
4:可以注解的位置類上
方法上
成員變量上。
返回值上
參數(shù)上
局部變量
import org.junit.Test;@MyTestpublic class RunTest { @MyTest PRivate int age; @MyTest() public void tt(@MyTest()int a){ @MyTest int xx=0; }}5:如果定義了一個注解之后,沒有說明這個注解可以注解的位置,則這個注解就可以注解在所有位置上
以下定義某個注解只可以注解到方法上:import java.lang.annotation.ElementType;import java.lang.annotation.Target;//設(shè)定注解可以注解的位置@Target(value={ElementType.METHOD})public @interface MyTest {}6:用途
6.1:在編譯時起到限制的作用.
public class MyServlet extends HttpServlet { @Override public void doGet(ServletRequest req,String name) throws ServletException, IOException { } }6.2:在運(yùn)行時組反射使用
所有類的字節(jié)碼Class,Method,Field,Constractor都擁有一個方法:
|
|
注解存在的范圍:
一個類:Retention,用于定義注解存在的策略:
java.lang.annotation
枚舉 RetentionPolicy
三個常量:
枚舉常量摘要 | |
| |
| |
| |
以下是經(jīng)常使用的標(biāo)準(zhǔn)定義:
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD})public @interface MyTest {}以下是myUnit的測試類: 核心方法: public class MyUnit { public static void main(String[] args) throws Exception { System.err.println("請輸入準(zhǔn)備被測試的類:"); Scanner sc = new Scanner(System.in); String clsName = sc.nextLine();//clsName = "cn.itcast.demo.RunTest"; //根據(jù)類名獲取這個類的字節(jié) Class cls = Class.forName(clsName); //實(shí)例化這個類,調(diào)用默認(rèn)構(gòu)造方法 Object obj = cls.newInstance(); //獲取這個類中的所有方法 Method[] ms = cls.getDeclaredMethods();//只獲取用戶定義的方法,private && public //cls.getMethods();獲取這個類所方法,包括從父類中繼承的方法 //遍歷判斷某個方法上是否存在注解 for(Method m:ms){ boolean boo2 = m.isAnnotationPresent(MyTest.class);//false if(boo2){ if(m.getModifiers()==Modifier.PRIVATE){ System.err.println("這個私有的方法:"+m.getName()+",不支持運(yùn)行..."); continue; } //運(yùn)行這個方法 m.invoke(obj); } }7、注解的實(shí)例化永遠(yuǎn)都不要實(shí)例化注解類,因注解是由系統(tǒng)通過反射實(shí)例化的。
新聞熱點(diǎn)
疑難解答