java注解:
一,概念:
java注解从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation)为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据)。
二,分类:
1.元注解:java提供了一种源程序中的元素关联任何信息和任何元数据的途径和方法。
包括:@override 表示覆盖或重写父类的方法,@Deprecated 表示该方法已经过时了(此句注解下的方法名中间有一个横线穿过),@Suppvisewarnings 表示忽略警告。
2.第三方注解: 导入别人的夹包,使用别人jar包中的一些数据会显示第三方注解。![](https://i-blog.csdnimg.cn/blog_migrate/c8282fcdf2b8b1a672b14bf14f27243e.png)
3.自定义注解:可以自定义注解。(通过反射可以获得注解中的值。)
自己定义一个 @interface Description{ string value();};在其他类或方法上面可以写Description(value=‘***’)。通过反射可以获取类或方法上的自定义注解。
在自定义注解上面添加
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited //(指的是可以被子类继承)
@Documented //(导出文件时,会同步导出注解)
解析:@Target 是注解的作用域 :表示该注解可以用于一个类中的那些属性及方法上,如果作用域类型有多个用英文逗号分隔 constructor-------------------构造方法声明;FIELD-------------------------字段声明;LOCAL_VARIABLE------------局部变量声明;METHOD----------------------方法声明;PACKAGE--------------------包声明;PARAMETER-------------------参数声明;TYPE---------------类,接口
@Retention:表示该注解的生命周期。 SOURCE------------------只在源码显示,编译时会丢弃;CLASS---------------编译时会记录到class中,运行时忽略;RUNTIME----------------------运行时存在,可以通过反射读取。
@Inherited:此注解是标识性的元注解,表示当前注解可以由子注解来继承
@Documented:表示生成javadoc的时候会包含注解
4.例子:
package cn.bdqn.li.fanshe; import java.lang.reflect.Method; import org.hamcrest.Description; import org.junit.Test; public class AnnotationTest extends FatherTest { @Deprecated//元注解之一:表示该方法已经过时 public void sing() {}; @Override//元注解之一:表示重写父类方法 public String name(){ return "重写父类方法"; } @SuppressWarnings("deprecation")//元注解之一:忽略制定警告 public void warningTest(){ AnnotationTest an=new AnnotationTest(); an.sing(); } //@Test //第三方注解 public void mianTest(){ System.out.println("JUnit4夹包中的"); } public static void main(String[] args) { try{ //1.使用类加载器加载类 Class<?> c=Class.forName("cn.bdqn.li.fanshe.FatherTest"); //2.判断该类是否存在 boolean isExist=c.isAnnotationPresent(Table.class); if(isExist){ //3.通过反射找出注解 Table d=(Table)c.getAnnotation(Table.class); System.out.println(d.value()); } Method m=c.getMethod("getId"); boolean flag=m.isAnnotationPresent(Table.class); if(flag){ Table a=(Table)m.getAnnotation(Table.class); System.out.println(a.value()); } }catch(Exception e){ System.out.println("11"); e.printStackTrace(); } } }
package cn.bdqn.li.fanshe; @Table(value = "这是父类") public class FatherTest { private int id; private String userName; @Table(value="获取id值") public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String name(){ return null; } }
package cn.bdqn.li.fanshe; import java.lang.annotation.*; @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Table { String value(); }
输出结果: