Java注解

1:所有注解都是类
2:所有注解类都默认是Annotation接口的子类。
3:定义方式:
       public @interface SomeAnotation{    }
4:可以注解的位置
     类上
     方法上
     成员变量上。
     返回值上
     参数上
     局部变量

5、如果定义了一个注解之后,没有说明这个注解可以注解的位置,则这个注解就可以注解在所有位置上

6:用途

  6.1:在编译时起到限制的作用.  

  6.2:在运行时组反射使用

              所有类的字节码Class,Method,Field,Constractor都拥有一个方法:

7、注解的实例化

       永远都不要实例化注解类,因注解是由系统通过反射实例化的。

 1 @Retention(RetentionPolicy.RUNTIME)//指定在运行时存在

2 @Target(value={ElementType.METHOD})//注解的位置 

通过@Target定义某个注解可以注解的位置

Retention,用于定义注解存在的策略

 1 System.err.println("请输入准备被测试的类:");
 2         Scanner sc = new Scanner(System.in);
 3         String clsName = sc.nextLine();//clsName = "cn.itcast.demo.RunTest";
 4         //根据类名获取这个类的字节
 5         Class cls = Class.forName(clsName);
 6         //实例化这个类,调用默认构造方法
 7         Object obj = cls.newInstance();
 8         
 9         //获取这个类中的所有方法
10         Method[] ms = cls.getDeclaredMethods();//只获取用户定义的方法,private && public
11         //cls.getMethods();获取这个类所方法,包括从父类中继承的方法
12         //遍历判断某个方法上是否存在注解
13         for(Method m:ms){
14             boolean boo2 = m.isAnnotationPresent(MyTest.class);//false
15             if(boo2){
16                 if(m.getModifiers()==Modifier.PRIVATE){
17                     System.err.println("这个私有的方法:"+m.getName()+",不支持运行...");
18                     continue;
19                 }
20                 //运行这个方法
21                 m.invoke(obj);
22             }
23         }

1 RunTest run = new RunTest();
2         Method m1 = run.getClass().getMethod("bbb");
3         //获取这个方法上的注解的实例
4         MyTest mt = m1.getAnnotation(MyTest.class);
5         //获取这个注解上的属性的值
6         String name = mt.name();
7         String value = mt.value();
8         System.err.println(name+","+value);

原文地址:https://www.cnblogs.com/liuwt365/p/4165754.html