Java注解(annotation)

百科介绍

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。Java中注解形式 @(注解名)

作用分类:

①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】

② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】

③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

常见注解

Java自带注解

@ override (表示覆盖的方法)@ deprecated(表示方法已经过时) @ suppvisewarning(表示忽略警告)

常见第三方注解

spring:@Autowired,@Service,@Repository;

mybatis:@InsertProvider,@UpdateProvider,@Options;

注解分类

  • 按照运行机制分类

源码注解;

编译时注解(在源码和.class中都存在):@override;@Deprecated;@Suppvisewarnings

运行时注解(在运行阶段还会起作用,甚至会影响程序的运行逻辑):@Autowired

  • 按照注解来源分类

来自jdk的注解,来自第三方的注解,自定义注解,元注解(给注解进行注解);

元注解:

@Target():注解的作用域

@Retention():注解的生命周期

@Inherit:允许子类继承,父类如果有注解,则子类会继承该注解信息

@Document:生成Javadoc会包含注解信息

自定义注解

package myannotation.test.com;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//表明该注解可以在方法和类上使用
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)//运行时
@Inherited//可以继承
@Documented

public @interface myannotation {//使用interface关键字
	//成员类型受到限制
	//合法类型包括基本类型以及String,class,annotation,enumeration
	
	//如果注解的成员只有一个那么名字必须是value()
	//在使用时可以忽略成员名和复制号(=)
	
	//注解类可以没有成员
	//此时称为标识注解
	
	String desc();//成员以无参数无异常方式声明
	String author();
	int age() default 18;//可以用default来指定默认值
	
}

 

 使用注解

package extense.test.com;
import myannotation.test.com.*;


public class Main {
	@myannotation(author = "ming", desc = "i'm hansome",age=20)
	public String face() {
		
		return null;
	}
}

解析注解

通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

package myannotation.test.com;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)//运行时  如果不是运行时则不会有一下结果  有兴趣自己试一下
@Inherited//可以继承
@Documented
public @interface descripe {

	String value();
}
package extense.test.com;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import myannotation.test.com.descripe;

public class ParseAnn {
	public static void main(String[] args) {
		//一使用类加载器加载类
		try {
			Class c=Class.forName("extense.test.com.Child");
			//二找到类上面的注解
			boolean isExist=c.isAnnotationPresent(descripe.class);//判断类上是否存在descripe这个注解
			if(isExist) {
				//三 拿到注解实例
				descripe d = (descripe) c.getAnnotation(descripe.class);
				System.out.println(d.value());
			}
			
			//四 获取方法上的注解
			Method[] ms = c.getMethods();
			for(Method m:ms) {
				boolean isMexist = m.isAnnotationPresent(descripe.class);
				if(isMexist) {
					descripe d=(descripe) m.getAnnotation(descripe.class);
					System.out.println(d.value());
				}
			}
			//另一种获取方法的注解
			for (Method m : ms) {
				Annotation[] as = m.getAnnotations();
				for (Annotation a : as) {
					if(a instanceof descripe) {
						descripe d=(descripe) a;
						System.out.println("2"+d.value());
					}
				}
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值