初识JAVA--注解

初识JAVA--注解

  • 注解
    • 注解的作用
    • 元注解
    • 内置注解
    • 注解的声明
    • 注解与反射

注解

  • 给代码看的注释

注解的作用

  • 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等

  • 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量

  • 在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出

元注解

  • 修饰注解的注解
  • 通常用在注解的定义上

JDK提供的4种注解

  • @Target:注解的作用目标

    • 表示该注解可以用于什么地方,可能的ElementType参数有
      • CONSTRUCTOR:构造器的声明
      • FIELD:域声明(包括enum实例)
      • LOCAL_VARIABLE:局部变量声明
      • METHOD:方法声明
      • PACKAGE:包声明
      • PARAMETER:参数声明
      • TYPE:类、接口(包括注解类型)或enum声明
  • @Retention:注解的生命周期

    • 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
      • SOURCE:注解将被编译器丢弃
      • CLASS:注解在class文件中可用,但会被VM丢弃
      • RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
  • @Documented:注解是否应当被包含在 JavaDoc 文档中

  • @Inherited:是否允许子类继承该注解

内置注解

JDK提供的三种注解

  • @Override:只能作用于方法之上,编译结束后将被丢弃
  • @Deprecated:标记当前的类或者方法或者字段等已经不再被推荐使用
  • @SuppressWarnings:主要用来压制 java 的警告

注解的声明

  • 注解的声明类似类的声明

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface 注解名{
            //注解体
    	}
    }
    

注解与反射

  • Class、Constrctor、Field、Method等类中均提供了与注解相关的方法
    • 获取注解对象和对象数组
      • getAnnotations()
      • getAnnotation()
    • 判断是否为注解
      • A.isAnnotationPresent(B.class),A类对象中是否包含注解B类

步骤

  • 定义注解类

    @Target({TYPE,METHOD,FIELD,CONSTRUCTOR})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TestA {
    	String name();
    	int id() default 0;
    	Class gid();
    }
    
  • 定义使用类

    package com.tmser.annotation;
     
    import java.util.HashMap;
    import java.util.Map;
     
     
    @TestA(name="type",gid=Long.class) //类成员注解
    public class UserAnnotation {
    
    	@TestA(name="param",id=1,gid=Long.class) //类成员注解
    	private Integer age;
    	
    	@TestA (name="construct",id=2,gid=Long.class)//构造方法注解
    	public UserAnnotation(){
    	}
    	
    	@TestA(name="public method",id=3,gid=Long.class) //类方法注解
    	public void a(){
    		Map m = new HashMap(0);
    	}
    	
    	@TestA(name="protected method",id=4,gid=Long.class) //类方法注解
    	protected void b(){
    		Map m = new HashMap(0);
    	}
    	public void b(Integer a){ 
    	}
    	
    	@TestA(name="private method",id=5,gid=Long.class) //类方法注解
    	private void c(){
    		Map m = new HashMap(0);
    	}
    }
    
  • 定义测试类

    package com.tmser.annotation;
     
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
     
    public class ParseAnnotation {
    	public static void parseTypeAnnotation() throws ClassNotFoundException {  
    		//获取类的类对象
    		Class clazz = Class.forName("com.tmser.annotation.UserAnnotation"); 
    		//获取其类注解对象
    		Annotation[] annotations = clazz.getAnnotations();  
    		for (Annotation annotation : annotations) {  
    			//根据类注解对象,获取注解中的内容,下同
    			TestA testA = (TestA)annotation;
    			System.out.println("id= ""+testA.id()+""; name= ""+testA.name()+""; gid = "+testA.gid());  
    		}  
    	} 
    	 
    	public static void parseMethodAnnotation(){
    		Method[] methods = UserAnnotation.class.getDeclaredMethods();  
    		for (Method method : methods) {  
    			boolean hasAnnotation = method.isAnnotationPresent(TestA.class);  //isAnnotationPresent,A类中是否包含注释B类
    			if (hasAnnotation) {  
    				TestA annotation = method.getAnnotation(TestA.class);  
    				System.out.println("method = " + method.getName()  
    						+ " ; id = " + annotation.id() + " ; description = "  
    						+ annotation.name() + "; gid= "+annotation.gid());  
    			}  
    		}  
    	}
    	 
    	public static void parseConstructAnnotation(){
    		Constructor[] constructors = UserAnnotation.class.getConstructors();  
    		for (Constructor constructor : constructors) { 
    			boolean hasAnnotation = constructor.isAnnotationPresent(TestA.class);  
    			if (hasAnnotation) {  
    			TestA annotation =(TestA) constructor.getAnnotation(TestA.class);  
    			System.out.println("constructor = " + constructor.getName()  
    						+ " ; id = " + annotation.id() + " ; description = "  
    						+ annotation.name() + "; gid= "+annotation.gid());  
    			}  
    		}  
    	}
    	public static void main(String[] args) throws ClassNotFoundException {
    		parseTypeAnnotation();
    		parseMethodAnnotation();
    		parseConstructAnnotation();
    	}
    }
    
  • 打印结果

    id= "0"; name= "type"; gid = class java.lang.Long
    method = c ; id = 5 ; description = private method; gid= class java.lang.Long
    method = a ; id = 3 ; description = public method; gid= class java.lang.Long
    method = b ; id = 4 ; description = protected method; gid= class java.lang.Long
    constructor = com.tmser.annotation.UserAnnotation ; id = 2 ; description = construct; gid= class java.lang.Long
    

你可能感兴趣的:(初识JAVA)