java关于注解的使用

时间:2022-06-01 20:37:11

     一:注解的基本概念

Java 注解就像修饰符一样,可以用于从java代码中抽取文档、跟踪代码中的依赖性或者在编译时做检查。注解可以被应用在包、类、方法、成员变量、参数和本地变量的声明中

注解的工作原理就是,先使用注解修饰java代码,然后另一块叫做注解处理器 的代码会解析这段注解和被修饰的代码并做相应的处理。

二、JDK内置的标准注解

Java SE中内置了三个标准注解,在java.lang中,他们是:

     1@Override:用于修饰子类的方法覆盖了父类中的方法;

    2  、@Deprecated:用于修饰已经过时了的方法,不推荐使用的方法;

    3   、@SuppressWarnnings:告诉java编译器禁止编译警告。

    @SuppressWarnings有一些参数用于表示特定的警告:

    1.    deprecation:不要给出不赞成使用的类或方法的警告

    2.    unchecked:不要给出类型转换时警告

    3.    fallthrough:不要给出”switch语句块没有break的警告

    4.    path:不要给出不存在的路径的警告;

    5.    serial:不要给出可序列化类缺少serialVersionUID”的警告;

    6.    finally:不要给出“finally语句块不能正常完成的警告;

    7.    all:不要给出以上所有情况的警告。

三、自定义注解

java提供了元注解用于自定义注解,进行自定义注解

说明:元注解---描述注解的注解

jdk5.0定义了四个元注解:

    1.@Target

    2.@Retention

    3.@Documented

    4.Inherited

@Target用来描述,自定义注解的使用范围

语法格式:@Target(ElementType.)

ElementType取值有: 
1. CONSTRUCTOR---
构造器 
2. FIELD---
 domain),通常理解的属性
3. LOCAL_VARIABLE---
局部变量 
4. METHOD---
方法 
5. PACKAGE: ---
 
6. PARAMETER---
参数 
7. TYPE---
类、接口(包括注解类型) enum枚举的声明

@Retention用来描述自定义注解的生命周期

语法格式:@Retention(RetentionPolicy.RUNTIME)

RetentionPoicy取值有: 
1. SOURCE:
在源文件中有效 
2. CLASS:
class文件中有效 
3. RUNTIME:
在运行时有效 

@Documented用于表示自定义注解可以被javadoc之类的工具文档化。

@Inherited

@Inherited元注解是一个标记注解,它阐述了某个被标注的类型是被继承的。

例子:

先自定义一个注解

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.CLASS;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;

import javax.lang.model.element.Element;

@Retention(RetentionPolicy.RUNTIME)//作用范围:运行时
@Target(ElementType.FIELD)//作用与属性
@Documented//可生产文档
public @interface Persion {
	String name() default "张三";//相当于注解的一个属性,并给默认值“张三”
}

在一个类中使用该注解

import java.util.Date;

public class Annotation {
	@Persion//使用自定义注解
	private String name;
	
	public String getName() {
		return name;
	}
}

设置测试类,通过反射机制实现使用注解为属性赋值
public class Test {

public static void main(String[] args) throws Exception {
Class a=Annotation.class;//获得反射
Object obj = a.newInstance();//进行实例化
Field field = a.getDeclaredField("name");//获得name属性
if(field.isAnnotationPresent( Persion.class)) {
Persion anno = field.getDeclaredAnnotation(Persion.class);//获得该属性的注解
field.setAccessible(true);//设置改属性可操作
field.set(obj,anno.name());//该注解的默认值赋值给该属性
}
Annotation aobj = (Annotation)obj;
System.out.println(aobj.getName());
}
}