介绍:
Annotation表示注解,是JDK1.5的新特性
JDK中常见的注解:
@Override
表示重写方法
@Deprecated
表示过时的方法
@SuppressWarnings("all"):
压制警告
自定义注解(了解)
public @interface MyAnnotation {
public static final int num1 = 100;
public static final String num2 = "abc";
public static final MyAnno num3 = null;
public static final Class num4 = String.class;
public static final int[] num5 = {};
public abstract String show1() default "show1";
public abstract int show2() default 132;
public abstract MyAnno2 show3() default @MyAnno2;
public abstract Class show4() default String.class;
public abstract int[] show5() default {1, 2, 3};
}
其中注解中的属性类型 可以是:
-
基本数据类型
-
String
-
Class
-
注解
-
枚举
-
以上类型的一维数组
而且注解与我们定义接口有点像,可以用定义接口时候的思维去定义注解,但是我们注解中属性类型不能是void,只是用接口的思维,前期学习理解,但是两者毕竟还是2个东西。
例如我们定义接口
public @interface MyAnno {
int num1 = 100;
String num2 = "abc";
MyAnno num3 = null;
Class num4 = String.class;
int[] num5 = {};
String show1() default "123";
int show2() default 132;
MyAnno2 show3() default @MyAnno2;
Class show4() default String.class;
int[] show5() default {1, 2, 3};
}
下面是我们自定义基本注解的基本使用情况:
1、下面AnnoTest类中show2方法报错的地方,是因为我注解声明的时候声明了2个属性,但是我在用的时候只为一个注解赋值了。
2、如果声明注解属性的时候,声明了数组,如果审数组元素的个数为1个,那么可以不添加大括号:{}.
3、如果注解中只有一个属性,且声明的时候就给了默认值,那么在使用的时候,不会再强制赋值,就不用手动给出了
4、特殊属性名称value
在属性名称为value时候,可以不用写属性名称,
了解
元注解:
@Target:可以指定注解在哪里进行使用(例如类上、方法上、成员属性、方法参数等)
@Retention:
只能放在注解上面进行使用
可以定义一个注解的声明周期
综合案例:
我希望被我自定义注解所标识的方法才能运行(注解+反射实现),不被标记的方法不运行
,注解是给虚拟机和程序看的,不是给人看的。
自定义注解代码:
package com.ligong.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解所能标记的地方
@Target(value=ElementType.METHOD)
//注解的声明周期
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
测试类
package com.ligong.annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class MyTestDemo {
public void show1(){
System.out.println("show3.....................");
}
@MyTest
public void show2(){
System.out.println("show2..........");
}
@MyTest
public void show3(){
System.out.println("show3..........");
}
public static void main(String[] args) throws Exception {
//通过反射获取测试类的实例
Class<?> clazz = Class.forName("com.ligong.annotation.MyTestDemo");
//获取无参构造方法
Constructor<?> constructor = clazz.getConstructor();
//创建测试类的对象
Object o = constructor.newInstance();
//获取成员方法集合,公共的方法
Method[] methods = clazz.getMethods();
for (Method method : methods) {
//如果这个方法被我的MyTest注解所标记,那么就运行这个方法
if (method.isAnnotationPresent(MyTest.class)){
method.invoke(o);
}
}
}
}