什么是注解?
- 注解不是注释,注释是给程序员看的,而注解是给程序看的。
- 注解用来描述程序如何运行及在什么阶段来运行。
- 注解在实际开发中,最大的功能就是替换配置文件。
- 注解是JDK1.5的新特性。
- 可以通过反射来让注解具有功能。
- 注解的格式:@XXX 。
- 注解的本质就是一个接口,这个接口需要继承Annotation接口。
三个基本的注解:
- @Override:检查子类是否重写了父类的方法,如果不加该注解,就不检查。
- @Deprecated:说明已经过时。
- @SuppressWarnings({"unused"}):抑制程序中的警告,unused是警告的类型,意思是没有使用过的方法或变量不警告,{}是数组,如果将unused替换成all是抑制所有警告。
如何来声明注解?
- 声明一个注解:@interface 注解名{}
- 声明注解中的成员,成员包括:基本类型、String、枚举、注解、Class、以上类型的一维数组。
- 注解的使用,在类、方法、变量上使用@定义的注解名。
式例代码:
package com.zgy.annotation;
public @interface MyAnnotation {
int a() default 1;
String b() default "ZGY";
String[] c() default {};
Class d() default Object.class;
}
package com.zgy.annotation;
public class Demo {
@MyAnnotation(a=2,b="YGZ",c= {"AA","BB"},d=String.class)
public void test01() {
}
}
模拟Junit单元测试
式例代码:
@Retention(RetentionPolicy.RUNTIME):注解的运行策略,RetentionPolicy.RUNTIME表示运行时执行。
package com.zgy.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyJunit {
String name() default "ZGY";
}
package com.zgy.annotation;
public class Demo2 {
@MyJunit(name="LHM")
public void test01() {
System.out.println("运行Test01方法");
}
@MyJunit
public void test02() {
System.out.println("运行Test02方法");
}
public void test03() {
System.out.println("运行Test03方法");
}
}
package com.zgy.annotation;
import java.lang.reflect.Method;
public class Demo3 {
public static void main(String[] args) throws Exception {
//通过反射获取Demo2类中的所有方法
Method[] methods = Demo2.class.getMethods();
for(Method m : methods) {
//去掉继承自Object的方法
if(m.getName().startsWith("test")) {
//获取方法上的注解
MyJunit junit = m.getAnnotation(MyJunit.class);
//获取注解中定义的成员的值
if(junit != null) {
System.out.println("name:"+junit.name());
//调用被注解的方法
m.invoke(Demo2.class.newInstance());
}
}
}
}
}
元注解
- 什么时元注解:只能用在注解上的注解。及修饰注解的注解。
注解的存活范围:Source(源码),Class(字节码),Runtime(运行时)
- @Retention:作用是改变自定义注解的存活范围,默认是Class,意思是在编译成class文件后,注解就不存在了。有三个值分别为:
RetentionPolicy.SOURCE
RetentionPolicy.CLASS
RetentionPolicy.RUNTIME - @Target:作用是指定该注解能用到什么地方,有以下几个值:
ElemenType.TYPE
ElemenType.METHOD
ElemenType.FIELD
ElemenType.ANNOTATION_TYPE - @Documented:跟生成API有关。
- Inherited:说明该注解可以被继承下去。
网友评论