注解和注释区别
* 注释:给程序员看的.
* 注解:给虚拟机看的.(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能.)
JDK中提供的注解
@Override :描述子类重写父类的方法:
* JDK1.5版本的时候 该注解只能应用在 类的继承上.
* JDK1.6版本的时候 该注解可以应用在 类的实现上.
@SuppressWarnings :压制警告.
@Deprecated :描述方法过时.
自定义注解
* 定义类 :class
* 定义接口 :interface
* 定义枚举 :enum
* 定义注解 :@interface
定义注解的属性:
注解的属性的类型:
* 基本数据类型
* String类型
* Class类型
* 注解类型
* 枚举类型
* 以上类型的一维数组
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.boomoom.a_annotation.demo2; /** * 自定义注解 * @author admin * */ @Anno1 @Anno2(a=1,s="abc",c=AnnotationDemo1.class,anno1=@Anno1,color=Color.RED,arrs={"aa","bb"}) @Anno3("abc") public class AnnotationDemo1 { } /** * 定义一个注解:名称是Anno1 */ @interface Anno1{ } /** * 定义一个带有属性的注解:Anno2 */ @interface Anno2{ int a(); boolean b() default false; String s(); // Date d(); Class c(); Anno1 anno1(); Color color(); String[] arrs(); } enum Color{ RED,BLUE,BLACK,YELLOW; } @interface Anno3{ String value(); int a() default 1; }
特殊的属性名称:value
* 如果使用注解的时候,只出现了value属性,value属性可以省略的.
代码实现
1、自定义注解:MyTest
2、定义核心运行类.
3、在核心运行类中.
3.1、获得测试类的Class
3.2、获得Class中的所有方法.
3.3、遍历得到每个方法.
3.4、判断方法上有MyTest注解,就执行该方法.
3.5、自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.boomoom.a_annotation.demo3; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * 自定义注解 * @author admin * */ // 自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解) // 自定义注解的存在时间有源码、编译和运行阶段,指定为运行阶段,才能在运行时有自定义注解存在 @Retention(value=RetentionPolicy.RUNTIME) public @interface MyTest { }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.boomoom.a_annotation.demo3; public class AnnotationDemo1 { @MyTest public void demo1(){ System.out.println("demo1执行了..."); } @MyTest public void demo2(){ System.out.println("demo2执行了..."); } public void demo3(){ System.out.println("demo3执行了..."); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.boomoom.a_annotation.demo3; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 核心运行类: * @author admin * */ public class CoreRunner { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { /** * 获得测试类的Class. * 获得Class中的所有的方法. * 遍历每个方法,查看每个方法上是否有MyTest注解. * 有MyTest注解,这个方法就执行. */ // 1.获得测试类的Class: Class clazz = AnnotationDemo1.class; // 2.获得Class中的所有的方法: 规定了测试的方法必须是public. Method[] methods = clazz.getMethods(); // 3.遍历每个方法: for(Method method:methods){ boolean flag = method.isAnnotationPresent(MyTest.class); // System.out.println(method.getName()+ " " + flag); if(flag){ // 说明方法上有MyTest注解: method.invoke(clazz.newInstance(), null); } } } }