`
爱宝贝丶
  • 浏览: 7415 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java中注解的使用

阅读更多

       使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节。注解就是用于修饰类、全局变量、方法、参数或局部变量的接口,java中规定,注解的使用不允许影响其修饰类的存在,也就是说如果将一个类的注解全部删除,这个类也能够编译通过。java中,注解的应用主要有四个方面:类注解,全局变量注解,方法注解,参数注解。其他的还有诸如包注解和局部变量注解这里暂不作讨论。首先我们定义一个类注解如下:

package annotation;

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)
public @interface TypeAnnotation {
  String say() default "this is a type annotation";
}

        在java中有四个元注解,分别是@RetentIon、@Target、@Inherited和@Document,@Retention指定的是注解的生命周期,其value参数的值有三个:RUNTIME、SOURCE、CLASS。RUNTIME表示当前修饰的注解是在虚拟机运行时实时加载的,也就是虚拟机中要用到该注解一次就加载一次;CLASS表示该注解在类的源文件和编译后的class文件中都存在,而在类加载器加载到虚拟机中时就会消失,SOURCE表示该注解只在源文件中存在,当编译成class文件后就不存在了。@Target指定的是当前注解可修饰的类型,可value参数可取如下几个值:Type、FIELD、METHOD、PARAMETER、PACKAGE、CONSTRUCTOR、LOCAL_VARIABLE、ANNOTATION_TYPE等。其中最主要的应用有TYPE、FIELD、METHOD、PARAMETER,其分别表示类注解,全局变量注解,方法注解,参数注解,其余几个则表示包注解,构造器注解,局部变量注解,用于注解的注解等。

 

       注解的声明同接口的声明类似,不过要在interface关键字前加@修饰以标明其为一个注解,在使用注解是括号中的变量名称也即注解声明时方法名称,声明方法时可以默认指定该方法的默认值,即在使用注解时若不指定该“变量”则该“变量”使用该方法的默认值,这里需要说明的是,若方法名称为value,那么在使用注解时,注解中该“变量名”可以不写,如上述Retention注解中的值(这种写法要求使用该注解时只指定这一个方“变量”的值)。

       如下示例我们分别演示了四个常用注解的声明方式:

package annotation;

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.FIELD)
public @interface FieldAnnotation {
  String say() default "this is a field annotation";
}

 

package annotation;

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)
public @interface MethodAnnotation {
  String say() default "this is a method annotation";
}

 

package annotation;

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.PARAMETER)
public @interface ParamAnnotation {
  String say() default "this is a parameter annotation";
}

        由于注解的使用已经非常广泛,下面我们通过一个类来简单演示注解的使用:

package source;

import annotation.FieldAnnotation;
import annotation.MethodAnnotation;
import annotation.ParamAnnotation;
import annotation.TypeAnnotation;

@TypeAnnotation(say = "this is modified type annotation")
public class Apple {
  @FieldAnnotation(say = "this is modified field annotation")
  private String color;

  @MethodAnnotation(say = "this is modified method annotation")
  public void setColor(@ParamAnnotation String color) {
    this.color = color;
  }

  public String getColor() {
    return color;
  }
}

        由于java规定,注解的使用不能对其使用类的存在产生影响,因而注解对于使用类只能起到一定的辅助作用,一个非常好的应用实例为javaweb中的权限控制,我们可以预定义一些权限码,然后在需要权限校验的地方使用自定义的注解;不过,因为java支持反射,因而通过反射注解就可以与使用类非常好的配合在一起,从而实现某些功能,一个非常好的例子是spring中的实体类对象属性的注入。下面我们通过一个简单的例子来说明如何通过反射获取注解值,并且利用反射使其与使用类产生关系:

package test;

import annotation.FieldAnnotation;
import annotation.MethodAnnotation;
import annotation.ParamAnnotation;
import annotation.TypeAnnotation;
import source.Apple;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.Type;

import org.junit.Test;

public class App {

  @Test
  public void testApp() throws Exception {

    Apple apple = Apple.class.newInstance();

    // 获取被注释的类
    if (Apple.class.isAnnotationPresent(TypeAnnotation.class)) {
      System.out.println(Apple.class.getAnnotation(TypeAnnotation.class).say());
    }

    // 获取被注释的变量
    Field[] fields = Apple.class.getDeclaredFields();
    for (Field f : fields) {
      if (f.isAnnotationPresent(FieldAnnotation.class)) {
        System.out.println(f.getAnnotation(FieldAnnotation.class).say());
      }
    }

    // 获取被注释的方法
    Method[] methods = Apple.class.getDeclaredMethods();
    for (Method m : methods) {
      if (m.isAnnotationPresent(MethodAnnotation.class)) {
        System.out.println(m.getAnnotation(MethodAnnotation.class).say());
      }

      // 获取当前方法被注释的参数
      Parameter[] parameters = m.getParameters();
      for (Parameter p : parameters) {
        if (p.isAnnotationPresent(ParamAnnotation.class)) {
          System.out.println(p.getAnnotation(ParamAnnotation.class).say());
        }
      }

      // 通过反射调用方法
      if (m.getName().startsWith("set")) {
        m.invoke(apple, "Red");
      }
    }

    System.out.println("通过反射调用对象的方法后对象变量的值:" + apple.getColor());
  }
}

       运行结果如下:

this is modified type annotation
this is modified field annotation
this is modified method annotation
this is a parameter annotation
通过反射调用对象的方法后对象变量的值:Red

       上述示例简单的阐述了反射和注解之间紧密的联系。在实际应用中, 注解的使用非常广泛,通过注解可以大大简化我们的开发,并且实现某些特定的效果,本文对注解的创建,使用以及深层调用方式进行了简单的介绍,希望大家能够喜欢!

 

分享到:
评论

相关推荐

    Java自定义注解使用反射获取字段注解

    Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查、代码生成、运行时处理等方面。本文将深入探讨如何通过反射机制来...

    java 自定义注解验证

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

    Java 使用注解拼接SQL语句

    例如,我们可以创建一个切面,该切面会在方法调用前/后检查是否有`@Query`注解,并根据注解中的SQL模板执行数据库操作。 3. **动态SQL**: 使用注解拼接SQL的一个关键优点是动态性。例如,我们可以根据方法参数...

    java注解代码java注解代码

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

    java关于注解使用的例子

    通过学习这些例子,你可以深入理解Java注解的工作原理,如何创建和使用自定义注解,以及它们在实际项目中的应用。同时,你还可以了解注解与其他Java特性的交互,如反射和注解处理器,这将有助于提升你的Java编程技能...

    Java自定义注解实例

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

    Java的注解包,在使用注解的时候导入的jjar包

    总的来说,Java注解与JUnit和Spring的结合,为Java开发者提供了一种高效、简洁的编程方式,使得测试、依赖管理和框架集成变得更加便捷。这两个JAR包是Java开发者日常工作中不可或缺的工具,对于保证代码质量和提升...

    java注解使用例子

    本篇文章将深入探讨Java注解的使用,包括其基本概念、类型、使用场景以及如何自定义注解。 首先,Java提供了三种预定义的注解类型,它们是: 1. `@Override`:确保方法真正重写了超类中的方法,如果找不到匹配的...

    java注解webservice学习第一篇

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

    java中主键id的注解解释

    本文档简述了有关javabean中id的注解解释,注解本来就很繁琐,但是学好的话用起来还是比较方便的

    java通用注解API

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

    java自定义注解实践

    Java 自定义注解实践是 Java 语言中的一项重要特性,它可以使开发者自定义注解,以满足不同的需求。在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ---- Java 自定义注解是 ...

    java自定义注解接口限流demo

    java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo...

    Java Annotation注解技术

    当定义了一个注解类型,开发者可以在代码中使用这个注解来标记程序元素。编译器或运行时环境会根据`RetentionPolicy`来决定是否保留这些注解。然后,通过Java反射API,可以获取到这些注解信息,进行相应的处理。 ...

    java自定义注解和通过反射获取注解

    接下来,我们可以在代码中使用这个自定义注解: ```java public class MyClass { @MyAnnotation(value = "Hello, Annotation!") public void myMethod() { // ... } } ``` 然后,我们可以利用反射来获取并处理...

    java和ssh注解

    Java注解是一种元数据,它提供了一种安全的方式向编译器或JVM传递信息。常见的注解如@Override、@Deprecated、@ SuppressWarnings等,它们可以帮助开发者进行类型检查、版本控制和消除警告。自定义注解可以用于更...

    java事务 - 使用注解

    本篇文章将深入探讨如何使用Java注解进行事务管理,特别是Spring框架中的@Transactional注解。 **1. 事务的基本概念** 事务具有四个特性,也称为ACID属性: - 原子性(Atomicity):事务中的所有操作要么全部完成,...

    Java注解实现方式

    注解提供了更加灵活和可扩展的方式来处理代码,避免了传统Java编程中使用接口或继承进行元数据定义的繁琐。 注解的语法结构通常由`@`符号开头,后跟注解的名称。例如,`@Override`表示方法应该覆盖父类的方法。注解...

    Java注解的使用例子

    本示例将探讨如何在Java中使用注解以及如何通过Ant构建工具来运行带有注解的程序。 首先,Java注解以`@`符号开头,后面跟着注解类型。例如,`@Override`是一个内置注解,表示方法试图重写超类中的方法。其他常见的...

    Java元注解是Java注解的重要特性,下面我就来详解常见的4大Java元注解

    Java 元注解详解 Java 元注解是 Java 注解的重要特性,它们是用于修饰注解的注解。Java 元注解的作用是通过使用 ...在实际开发中, Understanding Java 元注解的作用和使用场景对于提高编程效率和代码质量非常重要。

Global site tag (gtag.js) - Google Analytics