注解小结

注解(也被称为元数据,描述数据的数据)是在Java SE5中被引入的一项技术,与类、接口、枚举处于同一层次,也将被编译成class文件。

一、注解的作用

1、替代配置文件完成对某些功能的描述,减少程序配置;

2、保持代码清晰易读及编译期类型检查;

3、学习注解方便对开源代码的解读。

二、内置注解

Java SE5内置了以下三种标准注解,定义在java.lang中:

@Override,表示当前方法的定义将覆盖超类中的方法,如果被标记的类并没有实际覆盖超类,则编译器会发出错误警告。

@Deprecated,表示当前方法不应该再使用,当编程人员使用这些被标记的方法时,编译器会发出警告信息。

@SupperessWarnings,表示编译器将忽略特定的警告信息,此注解常用的参数值有:deprecation(忽略使用过时类或者方法),unchecked(忽略执行了未检查装换时警告) , fallthrough(忽略switch直接指向到下一个case块没有break警告),path(忽略类路径,源文件路径中有不存在路径时警告),serial(忽略可序列化类中没有serialVersionUID时的警告),finally(任何finally不能正常执行时的警告),all(以上所有)。

三、元注解

元注解的作用是负责注解其他注解,Java SE5内置了四种元注解:

@Target
表示该注解可以用于什么地方,可能的ElementType参数包括:

CONSTRUCTOR:构造器的声明

FIELD:域声明(包括enum实例)

LOCAL_VARIABLE:局部变量声明

METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类、接口(包括注解类型)或enum声明

@Retention
表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

SOURCE:注解存在于源代码中,编译时会被丢弃

CLASS:注解在class文件中可用,但会被VM丢弃

RUNTIME:VM在运行时也将保留注解,因此可以通过反射机制读取注解的信息

@Documented 将此注解包含在Javadoc中
@Inherited 允许子类继承父类中的注解

四、自定义注解

下面一段代码摘自于《Java编程思想(第4版)》,描述了注解的定义及使用:

//:annotation/UseCase.java
import java.lang.annotation.*;
//该注解可以作用于方法
@Target(ElementType.METHOD)
//JVM会读取注解,所以利用反射可以获得注解
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase{
    //定义成员变量
    //成员变量可以通过default指定默认值
    //如果成员变量不指定默认值的情况下,在引用接口时则必须给没有默认值的成员变量赋值
    public int id();
    public String description() default "no description";
}

//:annotations/PasswordUtils.java//注解的元素在使用时表现为键-值对的形式,其中键为方法名称,值类型为方法返回类型,并且需要置于@UseCase声明之后的括号内//注解元素可用的类型有:所有基本类型(int,float,boolean等)、String、Class、enum、Annotation、以上类型的数组
import java.util.*;
public class PasswordUtils{
    @UseCase(id=47,description="Passwords must contain at least one numeric")
    public boolean validatePassword(String password){
        return (password.matches("\\w*\\d\\w*"));
    }
    @UseCase(id=48)
    public String encryptPassword(){
        return new StringBuilder(password).reverse().toString();
    }
    @UseCase(id=49,description="")
    public boolean checkForNewPassword(List<String> prevPasswords,String password){
        return !prevPasswords.contains(password);
    }
}

注意:非基本类型的注解元素的值不可为null,这个约束使得处理器很难表现一个元素的存在或缺失的状态,使用空字符串或负数作为默认值是一种常用的做法。

五、注解处理器

如果不能解析注解,那注解也不会比注释更有用。在使用注解的过程中,注解处理器就是用来解析注解的重要工具。下面是一个简单注解处理器,用来读取PasswordUtils类,使用反射机制查找@UseCase标记,列出在PasswordUtils中找到的用例以及缺失的用例。

//: annotations/UseCaseTracker.java//getDeclaredMethods和getAnnotation为反射方法,都属于AnnotatedElement接口(Class、Method和Field都实现了该接口)
import java.lang.reflect.*;
import java.util.*;

public class UseCaseTracker{
    public static void trackUseCases(List<Integer> useCases,Class<?> cl){
        for(Method m:cl.getDeclaredMethods){
            UseCase uc=m.getAnnotation(UseCase.class);
            if(uc!=null){
                System.out.println("Found Use Case:"+uc.id()+" "+uc.description());
                useCases.remove(new Integer(uc.id()));
            }
        }
        for(int i:useCase){
            System.out.println("Warning:Missing use case-"+i);
        }
    }
    public static void main(){
        List<Integer> useCases=new ArrayList<Integer>();
        Collections.addAll(useCase,47,48,49,50);
        trackUseCases(useCases,PassordUtils.class);
    }
    /*Output:
    Found Use Case:47 Passwords must contain at least one numeric
    Found Use Case:48 no description
    Found Use Case:49 New passowords can‘t equal previously used ones
    */
}
时间: 2024-12-31 22:08:38

注解小结的相关文章

java注解小结

java注解小结: java中的注解一共有三个层次: 1.内置注解 2.声明注解 3.注解中的注解 一.内置注解包括: [email protected]:这个方法或类不再建议使用 [email protected]:这个方法是从父类/接口 继承过来的 [email protected]:如果参数传递的是不可具体化的类型,会产生警告信息 [email protected]:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息. 二.声明注解: 是附加在代码中的一些元信息,用于一些工具在编译.运

将一个类声明为Spring的bean的注解小结

1.@Repository,这个注解和@Component.@Controller和我们最常见的@Service注解是一个作用,都可以将一个类声明为一个Spring的Bean.它们的区别到不在于具体的语义上,更多的是在于注解的定位上.之前说过,企业级应用注重分层开发的概念,因此,对这四个相似的注解应当有以下的理解: @Repository注解,对应的是持久层即Dao层,其作用是直接和数据库交互,通常来说一个方法对应一条具体的Sql语句 @Service注解,对应的是服务层即Service层,其作

Spring注解小结

Spring是怎么知道要管理这个Dao或Service的? 让Spring用注解方式在Impl的来管理事务的步骤: 在spring-hibernate.xml 配置好扫描方式: <!—自动扫描Dao和Service包(自动注入)--> <context:component-scan base-package=”sy.dao,sy.service” /> 含义:Spring自动扫描这两个包及其下面的所有文件,如果这两个包下面的文件里包含     @Repository.@Servic

黑马程序员___java注解小结

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 注解是java 的一个新的类型(与接口很相似),它与类.接口.枚举是在同一个层次,它们都称作为java 的一个类型(TYPE).它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释.它的作用非常的多,例如:进行编译检查.生成说明文档.代码分析等. JDK提供的几个基本注解 a. @SuppressWarnings 该注解的作用是阻止编译器发出某

myBatis使用全注解小结

将最近工作中,使用到的myBatis注解方式的数据库操作总结一下 1.User model Public class User{ Private int id; Private int gid; Private int age; Private String sex; Getter and Setter ... } 2.Group model Public class Group{ Private int id; Private List<User> userList; Getter and

Spring注解与Java元注解小结

注解 Annotation 基于注解的开发,使得代码简洁,可读性高,简化的配置的同时也提高了开发的效率,尤其是SpringBoot的兴起,随着起步依赖和自动配置的完善,更是将基于注解的开发推到了新的高度. 元注解 meta-annotation Java 5 定义了四个标准的元注解类型,用以提供对其它注解的功能说明. 位于java.lang.annotation包下,分别为: 1. @Target 2. @Retention 3. @Documented 4. @Inherited 以@Prof

@PostConstruct注解小结

1.在具体Bean的实例化过程中,@PostConstruct注解的方法,会在构造方法之后,init方法之前进行调用2.在项目中@PostConstruct主要应用场景是在初始化Servlet时加载一些缓存数据等 举个例子,使用@PostConstruct注解: Class ServiceA{ private Map<String, String> initMap; //在这里加载一些缓存数据 @PostConstruct public void init() { initMap = new

一起来学Java注解(Annotation)

目录 一. 什么是Annotation 二. Annotation的作用 2.1 编译器使用到的注解 2.2 .class文件使用到的注解 2.3 运行期读取的注解 三. 定义Annotation 3.1 元注解 3.2 定义注解小结 四. Annotation处理 五. 总结 一. 什么是Annotation 我们在平时的开发过程中看到很多如@Override,@SuppressWarnings,@Test等样式的代码就是注解,注解是放到类.构造器.方法.属性.参数前的标记. 二. Annot

【06】Java注解 (未完待续)

B站地址:https://www.bilibili.com/video/av62102209 —————————————————————————————————————— 目录: 1.注解作用分类 2.自定义注解 —————————————————————————————————————— 1.注解作用分类 1)代码分析/检查代码,如:@override:检查方法是否是父类方法 2)生成文档,如jdk文档 编码格式 2.Java中预定义的注解使用 1)@Override名称不一样会报错 不加,就