java注解注意点
注意:以后工作中代码中 不允许出现警告
自定义注解
1:自定义注解并没有发挥它的作用,而Eclipse自带的注解通过反射另外有一套代码,可以发挥它的作用,例如:跟踪代码。。。。。。
2:如果自定义的代码中有属性,
a,default 有默认值 则在使用注解时,可以不用赋值
b:没有默认值,属性名为value,使用注解时可以直接赋值
c:没有默认值,属性名不为value,使用注解时必须属性名=值。
d:如果注解属性的数据类型为数组类型,赋多个值时必须使用{}括起来;但若只赋一个值,则无需使用{}
package classTwo03; public @interface Override { int a(); }
package classTwo03; public class Student { public String name="xioaming"; @Override(a=4) public boolean equals(Object obj) { return super.equals(obj); } } @FunctionalInterface interface Mammal{ void run() ; }
内置注解
@Override只能用于方法上,不能用于属性,类,非重写方法,注解重写的方法
@Deprecated 注解过时的方法
@ SupperssWarnings("参数") 参数为unused 代表为这个变量没有用到 。
参数为deprecation:代表使用已被@Deprecated标注的程序元素
参数为serial :代表在可序列化的类上缺少serialVersionUID定义
1 package Depracated; 2 3 import java.io.Serializable; 4 5 @SuppressWarnings("serial") 6 public class Test implements Serializable{ 7 8 public static void main(String[] args) { 9 10 @SuppressWarnings("unused") 11 String name; 12 13 move(new Bike()); 14 move(new Car()); 15 } 16 17 @Deprecated 18 public static void move(Bike bike) { 19 System.out.println("用自行车"); 20 } 21 22 public static void move(Car car) { 23 System.out.println("用汽车"); 24 } 25 } 26 27 class Bike{ 28 29 } 30 31 class Car { 32 33 }
元注解
1:Target({参数,参数......})参数可以为 ElementType.FIELD 代表这个被修饰的注解只能注解全局变量
ElementType.METHOD 代表这个被修饰的注解只能注解方法
ElementType.PACKAGE代表这个被修饰的注解只能注解包
ElementType.PARAMETER代表这个被修饰的注解只能注解参数
ElementType.TYPE代表这个被修饰的注解只能注解类,接口,枚举
2:Retention(参数)参数可以为RetentionPolicy.SOURCE代表这个被修饰的注解,所修饰的东西在源码结束后就没有这个注解了
RetentionPolicy.CLASS代表这个被修饰的注解,所修饰的东西在字节码结束后就没有这个注解了
RetentionPolicy. RUNNING代表这个被修饰的注解,所修饰的东西在运行结束后就没有这个注解了
默认是字节码阶段
3:@Documented 代表这个被修饰的注解可以在生成的文档中显示出来
Eclipse中文档如何显示:1):首先在src上右键——选择Export——选择java下的javadoc——
选择出javadoc.exe(在bin目录下)——yes就可以了
这个时候已经生成了文档,我们在java工程中看到
2):如何找到java工程的所在文件呢
java工程右键——porperties——location后面的那个小图标——就看到啦doc——
点击doc——我们看到有一个index.html——点击在网页页面就看到了我们的程序文档
在这个文档中就可以看到注解是否显示了出来
4:@Inherited 代表这个被修饰的注解可以被子类同样继承
package Practice; 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}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface RequestMapping { }
package Practice; public class Student extends Father { } @RequestMapping class Father{ }
注解工作原理
反射和注解综合
package Practice; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface RequestMapping { }
package Practice; public class Student { @RequestMapping @Deprecated public void run(int i) { } public void run() { } public void eat() { } }
package Practice; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test { @SuppressWarnings("rawtypes") public static void main(String[] args) { Class clazz = Student.class; try { Method [] mothods = clazz.getDeclaredMethods(); for (Method method : mothods) { Annotation [] anns=method.getAnnotations(); for (Annotation ann : anns) { System.out.println(ann); } } } catch (Exception e) { e.printStackTrace(); } } }