`

7、java注解

阅读更多

一、元数据

 

  1. 所谓元数据就是数据的数据。也就是说,元数据是描述数据的。
  2. 就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义
  3. 元数据可以用与创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查
  4. 许多元数据工具,如XDocklet,讲这些功能添加到核心java语言中,暂时成为java变成功能的一部分
  5. 一般来说,元数据的好处分为三类:
  6.   -文档编制,编译器检查和代码分析
  7.   --代码级文档最常被引用
  8.   ---元数据提供了一种有用的方法来指明方法是否取决于其他方法,他们是否完整,特定类是否必须引用其他类,等等

二、什么是注解

 

  1. java中的注解就是java源代码的元数据
  2. 也就是说注解是用来描述java源代码的
  3. 基本语法就是@后面跟注解的名称
  4. java5以上的版本都支持,有预定义的注解,也可以自定义注解
  5. 用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能
  6. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
  7. 注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。
  8. 注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。
  9. Java注解已经在很多框架中得到了广泛的使用,用来简化程序中的配置。

三、元注解

 

    元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种

1、@Retention: 定义注解的保留策略

@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

2、@Target:定义注解的作用目标

@Target(ElementType.TYPE)   //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR)  //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) //包
elementType 可以有多个,一个注解可以为类的,方法的,字段的等等
@Target({ElementType.TYPE,ElementType.METHOD})

3、@Documented:指示某一类型的注解将通过 javadoc 和类似的默认工具进行文档化。

4、@Inherited:说明子类可以继承父类中的该注解

 

 

四、Annotation的工作原理

 

  1. JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。
  2. 该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。
  3. Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。
  4. 它会反过来对正在运行的程序语义有所影响。
  5. Annotation可以从源文件、class文件或者在运行时通过反射机制多种方式被读取。

五、java.lang包中的三个注解

 

Override
表示一个方法声明打算重写超类中的另一个方法声明。
如果方法利用此注解类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override{}

Deprecated
用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。
@Documented
@Retention(value=RUNTIME)
public @interface Deprecated{}

SuppressWarnings
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(value=SOURCE)
public @interface SuppressWarnings{
String[] value();
}

 

六、自定义注解

 

  1. 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
  2. 在定义注解时,不能继承其他的注解或接口
  3. 注解的属性可以是任意数据类型,int String  Class 注解 数组。。。。都可以作为注解的属性
  4. 注解和接口一样,也可以定义其他的元素,如常量等
//自定义最简单的注解
public @interface MyAnnotation {

}
//使用自定义注解
public class AnnotationTest2 {

    @MyAnnotation
    public void execute(){
        System.out.println("method");
    }
}

 

//添加变量
public @interface MyAnnotation {

    String value();
}
//使用自定义注解
public class AnnotationTest2 {

    @MyAnnotation(value="abc")
    public void execute(){
        System.out.println("method");
    }
}
当注解中使用的属性名为value时,对其赋值时可以不指定属性的名称而直接写上属性值接口;
除了value意外的变量名都需要使用name=value的方式赋值。

 

//添加默认值
public @interface MyAnnotation {

    String value1() default "abc";
}
//多变量使用枚举
public @interface MyAnnotation {

    String value1() default "abc";
    MyEnum value2() default MyEnum.Sunny;
}
enum MyEnum{
    Sunny,Rainy
}
//使用自定义注解
public class AnnotationTest2 {

    @MyAnnotation(value1="a", value2=MyEnum.Sunny)
    public void execute(){
        System.out.println("method");
    }
}

 

//数组变量
public @interface MyAnnotation {

    String[] value1() default "abc";
}
//使用自定义注解
public class AnnotationTest2 {

    @MyAnnotation(value1={"a","b"})
    public void execute(){
        System.out.println("method");
    }
}

 

public @interface MetaAnnotation {
	String value();
}
//注解变量
public @interface MyAnnotation {

    MetaAnnotation annotationAttr() default @MetaAnnotation("xx");
}
//使用自定义注解,可以认为@MetaAnnotation是MetaAnnotation的一个实例对象
@MyAnnotation(annotationAttr=@MetaAnnotation("xxxx"))
public class AnnotationTest2 {

    public static void main(String[] args) throws Exception {
		
		if(MyMethod.class.isAnnotationPresent(AnnotationTest.class))
		{
			AnnotationTest a = MyMethod.class.getAnnotation(AnnotationTest.class);
			System.out.println(a.annotationAttr().value());
		}
	}
}

 

设置注解的作用范围:
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Retention
指示注释类型的注释要保留多久。
如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
只有元注释类型直接用于注释时,Target 元注释才有效。
如果元注释类型用作另一种注释类型的成员,则无效。

 

七、示例

 

    定义注解,解析注解

 

 

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface HelloWorld {
    public String name()default "";
}

 

import java.lang.annotation.*;

@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Yts {
    public enum YtsType{util,entity,service,model};
   public YtsType classType() default YtsType.util;
}

 

import java.lang.reflect.*;

import day25.Yts.YtsType;

public class ParseAnnotation {
	 
	public void parseMethod(Class clazz) throws Exception
	{
		//Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});
		Object obj = clazz.newInstance();
		for(Method method : clazz.getDeclaredMethods())
		{
	        HelloWorld say = method.getAnnotation(HelloWorld.class);
	        String name = "";
	        if(say != null)
	        {
	           name = say.name();
	           method.invoke(obj, name);
	        }
	        Yts yts = (Yts)method.getAnnotation(Yts.class);
	        if(yts != null)
	        {
	        	if(YtsType.util.equals(yts.classType()))
	        	{
	        		System.out.println(method.getName()+" is a util method");
	        	}
		        else
		        {
		            System.out.println(method.getName()+" is a other method");
		        }
	        }
        }
    }
   @SuppressWarnings("unchecked")
   public void parseType(Class clazz) throws Exception
   {
       Yts yts = (Yts) clazz.getAnnotation(Yts.class);
       if(yts != null)
       {
           if(YtsType.util.equals(yts.classType()))
           {
               System.out.println("this is a util class");
           }
           else
           {
              System.out.println("this is a other class");
           }
       }
   }
}

 

import day25.Yts.YtsType;

@Yts(classType=YtsType.model)
public class SayHell {

    @HelloWorld(name = " 小明 ")
    @Yts
    public void sayHello(String name){
        if(name == null || name.equals("")){
            System.out.println("hello world!");
        }else{
             System.out.println(name + "say hello world!");
         }
    }
    public static void main(String[] args)throws Exception {
             ParseAnnotation parse = new ParseAnnotation();
             parse.parseMethod(SayHell.class);
    	     parse.parseType(SayHell.class);
    }
 }

 

分享到:
评论

相关推荐

    java注解代码java注解代码

    java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解...

    java注解webservice学习第一篇

    Java注解是Java编程语言中的一个重要特性,它允许在代码中添加元数据,为编译器、解释器或任何其他工具提供额外的信息。在Java Web服务(WebService)开发中,注解的应用极大地简化了服务的创建和配置。本文将深入...

    java注解深入理解

    Java注解是Java编程语言中的一个重要特性,它提供了一种元数据的方式,允许程序员在代码中插入额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在现代Java开发中扮演了不可或缺的角色,尤其...

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    java注解大全(非常全面)

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,允许程序员在代码中插入信息,这些信息可以被编译器或运行时环境用于处理代码。注解不仅简化了开发,还增强了代码的可读性和维护性。本资料...

    Java注解实现方式

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据可以被编译器或运行时环境用来执行各种任务,例如代码分析、验证、生成代码、部署等。注解提供了更加灵活和可扩展的方式来处理...

    Java 注解技术视频详解

    Java注解技术是Java平台中一个非常重要的特性,它为元数据提供了强大的支持,使得开发者能够在代码中嵌入额外的信息,这些信息可以被编译器、JVM或第三方工具读取和处理。在本视频教程中,我们将深入探讨Java注解的...

    java 自定义注解验证

    首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不直接影响代码的执行。Java提供了内置的注解,如`@Override`、`@Deprecated`等,但自定义注解允许我们...

    JAVA 注解示例 详解

    本篇文章将深入探讨Java注解的使用及其在实际开发中的应用。 首先,我们了解Java注解的基本结构。一个注解以`@`符号开头,后面跟着注解类型,如`@Override`或`@Deprecated`。注解可以带有参数,参数以键值对的形式...

    Java自定义注解实例

    ### 一、Java注解概述 1. **定义**: 注解是一种声明式的编程元素,以`@`符号开头,后面跟着注解的名称。它们可以应用于类、接口、方法、变量等不同级别。 2. **预定义注解**: Java标准库提供了若干预定义注解,如`...

    java注解整理

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,让开发者能够向编译器或运行时环境传递额外的信息。这些信息可以用来验证代码、自动生成代码、配置框架或者在运行时进行一些处理。注解的使用...

    java注解jar包

    Java注解是Java编程语言中的一个重要特性,它允许在代码中添加元数据,这些元数据可以被编译器或运行时环境用来执行特定的操作。Java注解在软件开发中起着关键作用,它们简化了代码,提高了可维护性和可读性,同时也...

    入门级java 注解学习示例代码

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,它提供了一种安全的方式,使我们可以在不改变程序代码本身的情况下,向编译器或运行时环境提供额外的...

    java 注解

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据(metadata),这些元数据不直接影响程序的执行,但可以被编译器或运行时环境用来进行各种处理,如验证、动态代理、持久化、资源管理等。...

    Java 使用注解拼接SQL语句

    在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或运行时环境用来执行特定的任务。"Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得...

    java注解使用例子

    Java注解(Annotation)是Java语言提供的一种元数据机制,用于向编译器、JVM或者第三方工具提供信息。在Java程序中,注解可以被附加到类、接口、方法、变量等元素上,用于执行代码检查、生成代码、部署等任务。本篇...

    java通用注解API

    本文将深入探讨Java注解的API及其使用。 1. **注解的基本概念** - 注解(Annotation)是Java SE 5.0引入的新特性,它是一种用于向编译器或JVM提供元数据的方式。 - 注解通过`@`符号后跟注解类型的名称来应用,如`...

    Java注解的使用例子

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了一种结构化的方式。元数据是在程序代码中包含的关于程序本身的信息,但这些信息并不直接影响程序的执行。注解允许开发者向编译器、JVM或工具提供...

    对spring做java注解扩展

    本文将深入探讨如何在Spring框架中利用Java注解进行扩展,以提升代码的可读性和可维护性。 首先,我们需要了解Java注解(Annotation)。注解是Java语言的一种元数据,它提供了在编译时或运行时对代码进行信息附加的...

Global site tag (gtag.js) - Google Analytics