1:所有注解都是类
2:所有注解类都默认是Annotation接口的子类。
3:定义方式:
public @interface SomeAnotation{
}
4:可以注解的位置
类上
方法上
成员变量上。
返回值上
参数上
局部变量
import org.junit.Test; @MyTest public 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都拥有一个方法:
boolean
|
isAnnotationPresent (Class<? extends Annotation> annotationClass) 如果指定类型的注解存在于此元素上,则返回 true,否则返回 false。 |
注解存在的范围:
一个类:Retention,用于定义注解存在的策略:
java.lang.annotation
枚举 RetentionPolicy
三个常量:
枚举常量摘要 |
|
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 在.class存在,在运行时擦除 |
|
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。运行时存在。 |
|
SOURCE 编译器要丢弃的注释。只在.java文件中存在@Overied |
以下是经常使用的标准定义:
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、注解的实例化
永远都不要实例化注解类,因注解是由系统通过反射实例化的。
时间: 2024-08-02 19:16:54