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); } } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)