1:所有注解都是类
2:所有注解类都默认是Annotation接口的子类。
3:定义方式:
public @interface SomeAnotation{
}
4:可以注解的位置
类上
方法上
成员变量上。
返回值上
参数上
局部变量
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;//设定注解可以注解的位置@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:在运行时组反射使用
所有类的字节码Class,Method,Field,Constractor都拥有一个方法:
|
|
注解存在的范围:
一个类:Retention,用于定义注解存在的策略:
java.lang.annotation
枚举 RetentionPolicy
三个常量:
枚举常量摘要 | |
|
|
|
|
|
|
以下是经常使用的标准定义:
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("请输入准备被测试的类:"); Scanner sc = new Scanner(System.in); String clsName = sc.nextLine();//clsName = "cn.itcast.demo.RunTest"; //根据类名获取这个类的字节 Class cls = Class.forName(clsName); //实例化这个类,调用默认构造方法 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()+",不支持运行..."); continue; } //运行这个方法 m.invoke(obj); } }
7、注解的实例化
永远都不要实例化注解类,因注解是由系统通过反射实例化的。