Java注解

一、什么是JAVA的注解?

     注解,顾名思义就是对某种事物添加一个注释说明的意思,标注某种事物的特征以及形态,供日后其它人遇到该事物时有一个直观的认识。JAVA注解又叫JAVA标注,JAVA语言提供一套机制,可以在包、类(包括接口、枚举、注解)、方法、字段(包括常量)、方法参数、局部变量、构造器和注解这些元素上添加标注(即为这些元素附上一些标识信息),在某些业务需要的情况下,可以通过JAVA的反射机制获得这些元素的标识信息,做进一步的操作。

 

二、自定义JAVA注解

1、为什么要自定义注解?

在JDK5.0以后默认提供了三个常用的注解类:

1)、@Override:只能作用于方法之上,用来告诉别人这个方法是改写父类的一个方法。

2)、@Deprecated:可以作用于程序中任何元素之上,用 @Deprecated 注释的程序元素,不鼓励程序员使用,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。

3)、@SuppressWarnings:只能作用于TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE上,用于关闭编译器提示的警告信息。

因为在日常工作中,三个注解类是完全不能满足业务需求的,所以要根据自己的业务需求,定义自己的注解类。

2、如何自定义注解?

自定义注解的步聚:

1)、通过@interface关键字声明注解名称,和定义类(class)、接口(interface)、枚举(emum)的方式一样,只有关键词不一样,用“@interface”标识。

2)、使用JAVA内置的四个元注解对自定义的注解作用范围做一些限制。

3、什么是元注解?

元注解,就是专门用来定义注解的注解,主要作用就是用于约束自定义注解的功能。比如注解只能用在方法上、类上或字段上。其中JDK5.0中内置的三个注解,也是通过元注解来约束的。

元注解有哪些呢?

/*
 * JDK自带的元注解有:@Target,@Retentio,@Documente,@Inherited
 *
 * @Target:指示该注解类型用于什么元素之上,如果注解没有添加@Target标示,则可以作用于任一程序元素上,如果加上了@Target注解类型约束,则编译器会强制检查作用于程序元素上的限制。
 * 可选的ElementType注解类型包括:
 * ElementType.ANNOTATION_TYPE:只能作用于注解类型上
 * ElementType.CONSTRUCTOR:只能作用于构造方法上
 * ElementType.FIELD:只能作用于字段上(包括枚举常量)
 * ElementType.LOCAL_VARIABLE:只能作用于局部变量上
 * ElementType.METHOD:只能作用于方法上
 * ElementType.PACKAGE:只能作用于包上
 * ElementType.PARAMETER:只能作用于方法参数声明上
 * ElementType.TYPE:只能作于类、接口、枚举、注解上
 *
 * @Retention:指示在什么级别保留注解信息。如果注释类型声明中不存在Retention,则保留策略默认为 RetentionPolicy.CLASS。
 * 可选的RetentionPolicy保留级别包括:
 * RetentionPolicy.SOURCE:仅保留在源代码中,javac编译完后,会丢弃注解。不会保存在编译好的class文件上。
 * RetentionPolicy.CLASS:保留在源代码和class文件中,jvm加载class字节码文件时,不会加载注解。
 * RetentionPolicy.RUNTIME:即保留在源代码和class文件中,也会被jvm加载到内存当中,所以可通过反射的方式读取注解信息。
 *
 * @Documented:标示了此注解的元素,注释将成为注解元素公共API的一部分。
 *
 * @Inherited:指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。
 */

4、自定义注解及使用示例

1)、自定义一个类级别的注解TypeAnnotation

package annotation;

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;

@Retention(RetentionPolicy.RUNTIME)	//此注解会一直保留到运行时
@Target(ElementType.TYPE)			//此注解应用于类、接口、枚举、注解上
@Documented	//此注解会包含在javadoc中
public @interface TypeAnnotation {

	String value();

}

2)、自定义一个方法级别的注解MethodAnnotation

package annotation;

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;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface MethodAnnotation {

	String name();

	String address();

}

3)、定义一个注解使用类TestAnnotation,并使用这两个注解

package annotation;

@TypeAnnotation("hi,i am TypeAnnotation...")
public class AnnotationResource {

	@MethodAnnotation(name="zhangsan",address="北京")
	public void getPersonInfo() {
		System.out.println("hello,i am zhangsan");
	}

	@MethodAnnotation(name="lisi",address="上海")
	public String getPersonInfo2() {
		return "lisi,来自上海!";
	}

}

4)、然后使用反射的方式获取这两个注解的信息

package annotation;

import java.lang.reflect.Method;

/**
 * 测试注解的使用
 */
public class TestAnnotation {

	public static void main(String[] args) {
		AnnotationResource ar = new AnnotationResource();
		Class clazz = ar.getClass();
		//通过反射获得类注解信息
		if (clazz.isAnnotationPresent(TypeAnnotation.class)) {
			TypeAnnotation typeAnnotation = (TypeAnnotation) clazz.getAnnotation(TypeAnnotation.class);
			System.out.println(typeAnnotation.value());
		}

		//通过反射获得方法注解信息
		Method[] methods = clazz.getMethods();
		for (Method method : methods) {
			if (method.isAnnotationPresent(MethodAnnotation.class)) {
				MethodAnnotation methodAnnotation = method.getAnnotation(MethodAnnotation.class);
				System.out.print("姓名:" + methodAnnotation.name() + "\t");
				System.out.println("地址:" + methodAnnotation.address() + "\t");
			}
		}
	}
}

注意:

1、自定义的Annotation,隐式的继续自java.lang.Annotation,所以不能在继承其它的类或接口。

2、在Annotation中声明的方法只能是public的,或者默认不加访问修饰符。

3、方法的返回值类型只限8种基本类型byteint、short、longfloat、double、char、boolean,和String、enum、annotation、Class,以及这些类型的数组。

4、方法不能有参数

5、方法不能抛异常

时间: 2024-11-01 17:30:38

Java注解的相关文章

利用Java注解特性加载属性文件(properties)的值到Java类

在此之前我都是写个PropertyUtil类来加载配置文件,然后通过get方法,把key对应的值取出来. Spring提供一个PropertyPlaceholderConfigurer类,可以读取配置文件,然后在Spring配置文件通过${hibernate.dialect}这种方式注入到JavaBean中,有个不好的地方就是,要在代码中取的时候不是很方便. 然后在接触到Java注解特注解技术以后,感觉这个东东很好,hibernate映射,WebService都可以通过注解来完成,方便的很多,然

Java注解与应用

什么是注解 注解是Java 5的一个新特性.注解是插入你代码中的一种注释或者说是一种元数据(meta data). 这些注解信息可以在编译期使用预编译工具进行处理(pre-compiler tools),也可以在运行期使用Java反射机制进行处理.下面是一个类注解的例子: @MyAnnotation(name="someName", value = "Hello World") public class TheClass { } 在TheClass类定义的上面有一个

Java注解Annotation解析_java

概述        Java在1.5版本引入注解Annotation,又称Java标注,注解是一种语法元数据,可以被直接使用到源代码中,类/方法/变量/参数/包名等都可以被注解.和Javadoc标签不同,编译器在生成class文件时候能够保留注解代码,同时,可能为了在程序运行过程中(run-time)可以使用注解,Java虚拟机会把注解保留,这样就可以通过反射获取注解Annotation的相关信息. 内置注解 其实我们平时会经常遇见注解,例如@Override.@Deprecated等等,这些都

Java 注解指导手册 – 终极向导

原文链接 原文作者:Dani Buiza 译者:Toien Liu  校对:深海 编者的话:注解是java的一个主要特性且每个java开发者都应该知道如何使用它. 我们已经在Java Code Geeks提供了丰富的教程, 如Creating Your Own Java Annotations, Java Annotations Tutorial with Custom Annotation 和 Java Annotations: Explored & Explained. 我们也有些文章是关于

Java @注解

阅读目录 1.注解简介 2.使用注解 3.开发注解 回到顶部 1.注解简介      在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道.以Java EE中典 型的S(pring)S(truts)H(ibernate)架构来说,Spring.Struts和Hibernate这三个框架都有自己的XML格式的配置文件.这些配置文件需要与Java源代码保存同步,否则的话就可能出现错误.而且这些错误有可能到了运行时刻才被发现.把同一份信息保存在两个地方,总是个坏的主意.理

Java注解全面解析(转)

1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(RetentionPolicy.RUNTIME) public @interface Test {}   除了@符号以外,@Test的定义很像一个空的接口.定义注解时,需要一些元注解(meta-annotation),如@Target和@Retention @Target用来定义注解将应用于什么地方(如一个方法或者

JAVA注解Annotation

JAVA注解Annotation JAVA注解Annotation 什么是注解 为什么要引入注解 JDK内建Annotation JDK元Annotation Annotation示例 自定义注解 提取Annotation信息 Annotation处理器编写 Annotation处理器处理异常 什么是注解?   用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override publicString toString()

Java 注解详解 (annotation)

什么是java注解 注解是java5的新特性.注解可以看做一种注释或者元数据(MetaData),可以把它插入到我们的java代码中,用来描述我们的java类,从而影响java类的行为. Java注解的目的 使用Java注解一般来说主要有三种目的 构建时指示: RetentionPolicy.SOURCE 编译期指示: RetentionPolicy.CLASS 运行时指示: RetentionPolicy.RUNTIME Java注解可以用在构建期.当构建我们的工程时,构建进程会编译源码.生成

Java注解教程及自定义注解

Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许多java框架中大量使用注解,如Hibernate.Jersey.Spring.注解作为程序的元数据嵌入到程序当中.注解可以被一些解析工具或者是编译工具进行解析.我们也可以声明注解在编译过程或执行时产生作用. 在使用注解之前,程序源数据只是通过java注释和javadoc,但是注解提供的功能要远远超