JAVA注解开发介绍

JAVA注解介绍

前言

在我们的日常学习和编写项目的时候可能会遇到一些写在类、方法上或者是变量上的注解,比如:

@Componet
public class Hello{
	@Override
	public String toString(){
		return "";
	}
}

这些注解有的可以帮助我们解决很多的问题,比如:@Override帮我们解决方法是否是重写的,Spring中的@Compoent帮我们把类注入IOC容器,AOP提供的注解简单就完成了切面的增强…
为什么一个简单注解可以解决这么多的问题?这次我就对注解进行一个简单的入门帮大家简单了解一下注解魅力!!

一个大佬写的有关注解的博客:传送门


正文

  • 注解(Annotations)的定义摘自百度百科

注解基础知识点
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

注意:百度百科其实说的比较明白了注解其实是对元素进行说明的,其实就和注释一样。它本身并不具备各种逻辑功能,比如@Override的源代码:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
  • 注解(Annotations)的结构

在这里插入图片描述
这整个头就是注解了:
注意:

  1. 注解就和一个类一样,既可以没有属性也可以没有功能,但一般这种情况几乎没有。
  2. 注解的功能不一定被定义域注解域中(可以理解为类的方法不在本类中),这个要是情况而定
  3. 注解内部的属性的类型只支持基本数据类型、String、枚举,支持在内部创建枚举。
  • 注解(Annotations)的四大元注解

    @Documented
    @Inherited
    @Target(ElementType.METHOD,)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {}
    
    上述的@Documented@Inherited@Target@Retention四个注解就是元注解,我们所有自定义的注解一般都绕不开它们。
    • @Target:
      此注解的取值将影响注解的使用地点,是类注解还是方法注解等。当去只取一个的时候直接填写值即可,多个的时候以value={}的数组形式填写。

      可取的值
      ElementType.TYPE:用于描述类、接口或enum声明
      ElementType.FIELD:用于描述实例变量
      ElementType.METHOD
      ElementType.PARAMETER
      ElementType.CONSTRUCTOR
      ElementType.LOCAL_VARIABLE
      ElementType.ANNOTATION_TYPE 另一个注释
      ElementType.PACKAGE 用于记录java文件的package信息

    • @Retention:
      此注解的取值将影响注解的生命周期,换句话说就是注解在什么时候被销毁,这将影响到注解的功能。

    可取的值,只能选择其一
    RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。
    RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
    RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

    • @Documented:
      此注解表示是否将该注解的信息加入java文档
    • @Inherited:
      定义该注释和子类的关系

实践

这个例子只是注解的简单入门使用,会加上注解的功能,会涉及到反射的用法,但是代码结构简单。代码的大致结构也是按照上一篇博客给出的链接所编写

// 注解定义
@Target(value = {ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    public enum FLAG{TRUE, FLASE}
    public enum STATUS{BEFORE, ING, AFTER}
    public String Author() default "lxx";
    public FLAG Flag() default FLAG.FLASE;
    public STATUS Status();
}
// 注解功能类 定义了注解功能
public class LoadMyAnnotation {
    public static void LoadMyAnnotationA(){
        // 获取含有注解的类的Class
        Class myannotation = ImpClass.class;
        for (Method method : myannotation.getMethods()){
            // 这个方法使用了泛型处理
            MyAnnotation temp = method.getAnnotation(MyAnnotation.class);
            if(temp != null){
                System.out.println("Method Name" + method.getName());
                System.out.println("Autor:" + temp.Author());
                System.out.println("Flag:" + temp.Flag());
                System.out.println("Status:" + temp.Status());
            }
        }
    }
}

// 注解使用类
public class ImpClass {
    @MyAnnotation(Author = "假人", Flag =  MyAnnotation.FLAG.TRUE, Status = MyAnnotation.STATUS.BEFORE)
    public void Helloword(){
        System.out.println("helloword");
    }
}

// Main方法测试类
public class Client{
	public static void main(String[] args) throws Exception {
		// 加载注解 会输出ImpClass注解中定义的属性和"helloword"
	    LoadMyAnnotation.LoadMyAnnotationA();
        // 调用 没有任何的变化
        ImpClass impClass = new ImpClass();
        impClass.Helloword();
	}
}

总结

这篇博客所介绍关于注解的部分仅仅是个入门,在JAVA庞大的开源和商业框架中,注解的种类和功能千遍万化,本文章仅仅是入门前的台阶,希望大家能抛去浮躁认真学习。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章