1、JDK中提供的三个基本的注解
@Deprecated:标注XX过时的。
@SuppressWarnings:抑制警告
unused:抑制的警告类型
{ "unused", "rawtypes", "unchecked" }:数组,抑制的多个警告类型
all:抑制所有警告
@Override:保证用户确实是覆盖了父类的某个方法。
2、自定义注解
使用@interface关键字来声明注解:public @interface MyAnn1{}
声明注解的属性字段:类型 字段名() [defalut 默认值];
注解属性的类型只能下面的几种:
String Class 八个基本类型 注解类型 枚举类型 及以上类型的1维数组。
特殊属性:String value;或String[] value();
使用时,直接给定取值,而不用加属性名称
public @interface MyAnn1 {
String name() default "";
int age() default -1;
String city();
MyAnn2[] ann();
}
public @interface MyAnn2 {
String name() default "";
String[] value() default "";
}
public class UserMyAnn1 {
@MyAnn2("abc")
public void m2() {
}
@MyAnn2(value = "abc", name = "def")
public void m3() {
}
@MyAnn2(name = "def", value = { "a", "b", "c" })
public void m4() {
}
@MyAnn1(name = "abc", city = "BJ", ann = {
@MyAnn2(name = "a", value = "b"), @MyAnn2(name = "c", value = "d") })
public void m5() {
}
}
3、元注解
服务于注解的注解就是元注解
*@Retention:指定注解的存活范围。默认是CLASS
RetentionPolicy:SOURCE|CLASS|RUNTIME
![这里写图片描述](https://img-blog.csdn.net/20160208164439684)
*@Target:指定注解可以用在什么元素上
ElementType:TYPE|METHOD|。。。
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被
@Inherited 修饰的 Annotation, 则其子类将自动具有该注解
public class MyJunitTest {
@MyTest(time=100000000)
public void testAdd(){
System.out.println("执行了add方法的测试");
}
@MyTest
public void testUpdate(){
System.out.println("执行了update方法的测试");
}
}
public class MyTestRunner {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
test2();
}
private static void test2() throws IllegalAccessException,
InvocationTargetException, InstantiationException {
Class clazz = MyJunitTest.class;
Method ms[] = clazz.getMethods();
for(Method m:ms){
MyTest myTest = m.getAnnotation(MyTest.class);
if(myTest!=null){
long timeLimit = myTest.time();
if(timeLimit>-1){
long startTime = System.nanoTime();
m.invoke(clazz.newInstance(), null);
long useTime = System.nanoTime()-startTime;
if(useTime>timeLimit){
System.out.println(m.getName()+"执行效率没有测试通过");
}
}else{
m.invoke(clazz.newInstance(), null);
}
}
}
}
private static void test1() throws IllegalAccessException,
InvocationTargetException, InstantiationException {
Class clazz = MyJunitTest.class;
Method ms[] = clazz.getMethods();
for(Method m:ms){
boolean b = m.isAnnotationPresent(MyTest.class);
if(b){
m.invoke(clazz.newInstance(), null);
}
}
}
}