注解

本文深入探讨了Java注解的原理、作用及其在不同场景下的应用方式,包括如何使用注解、注解的创建与元注解的概念,以及通过反射获取注解属性的详细流程。

Annotation

       注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

     java.lang包中的注解

      @SuppressWarnings :在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告.

      例如 @SuppressWarnings("deprecation")取消编译器放出的方法过时警告,在编译过时方法时,编译器不会再发出警告,

      @SuppressWarnings(String[])其中传入的值为一个String数组,如只有一个值可以直接将值写入

      

      @@Deprecated 用于标记在方法上,表示此方法已过时,


     @Override 重写注解,表示此方法是从父类重写而来的,可减少重写的错误率.

<span style="font-size:12px;">public class AnnotationTest {
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		System.runFinalizersOnExit(true);
	}
	
	@Deprecated
	public void sayHellow(){
		System.out.println("Hellow");
	}
	
	@Override
	public String toString(){
		return null;
		
	}
}
</span>

       注解的应用方法:使用注解需要3个类:注解类,使用了注解的类和对使用了注解的类进行反射的类.

            

      创建注解:

             @interface用于创建注解

<span style="font-size:12px;">public @interface AnnotationMake {
	
	String value();
}</span>

    元注解:

         可以理解为注解的注解,用在注解类上

         @Target(ElementType[])指示注释类型所适用的程序元素的种类,如方法,类,字段,注解等。如未指定@Target代表创建的注解可以在任意地方使用,若已指定九只能在指定的地方使用.@Target可以设置多个参数,但是必须将参数放在数组里

        ElementType 为一个枚举.枚举提供货Java 程序中声明的元素的简单分类.   注意: 类的常量是TYPE;

        @Retention(RetentionPolicy)  指示注释类型的注释要保留多久;

        RetentionPolicy中有三个常量SOURCE,CLASS,RUNTIME分别表示java类运行的三个阶段

                 SOURCE:为java源文件阶段,编译器要丢弃的注释.

       CLASS:CLASS文件,在字节码加载到内存前会丢弃.

       RUNTIME: 运行时阶段,加载到内存后仍然保留


       注解的属性

             属性的创建跟方法类似

            String color() default "qw";   String为属性类型     color 为属性名     default 为缺省值

          value属性如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,直接写值

   数组类型的属性

         int []arrayAttr()default {1,2,3};

       @MyAnnotation(arrayAttr={2,3,4})

     如果数组属性中只有一个元素,这时候属性值部分可以省略大括

  枚举类型的属性

        EnumTest.TrafficLamp lamp() ;

       @MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

  注解类型的属性:

       MetaAnnotationannotationAttr()default @MetaAnnotation("xxxx");

      @MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”))

<span style="font-size:14px;">@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface ItheimaAnnotation {
	String color() default "red";
	int[] value();
	Lamp lamp() default Lamp.E2N;
	AnnotationMake annotation() default @AnnotationMake("dd");
	Class classzz() default String.class;
}
</span>


   注解的使用与反射

     注解的赋值为 属性名 = 值  除value属性在一些情况下可以省去属性名外其他都需要写上属性名.有缺省值得属性可以不赋值.数组属性在只有一个元素时可以省略大括.

     可以通过反射类中的注解得到注解的属性

@ItheimaAnnotation(color="green", value={1,2,3}, lamp=Lamp.N2E, annotation=@AnnotationMake("aa"), classzz=Integer.class)
public class annotationTest {
	
	@ItheimaAnnotation(1)
	public static void main(String[] args) {
		if(annotationTest.class.isAnnotationPresent(ItheimaAnnotation.class)){
			ItheimaAnnotation annotation = annotationTest.class.getAnnotation(ItheimaAnnotation.class);
			System.out.println(annotation);
			System.out.println(annotation.color());
			System.out.println(annotation.value().length);
			System.out.println(annotation.lamp());
			System.out.println(annotation.annotation());
			System.out.println(annotation.classzz());
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值