Java注解

原创 2016年06月02日 10:31:02

1、 概述:

     a. 概念:提供对元数据的支持,可以在编译、加载和运行时被读取,并执行相应的处理.
     b. 作用范围:用于修饰包、类、构造器、方法、成员变量、参数和局部变量的声明.
     c. 使用形式:name = value形式
     d. 特点:不会影响代码的执行.

2、 基本注解(Java提供的注解):

  这三个注解都在java.lang包下.
*分类*
     * @Override:限定重写父类方法.
     * 当前类必须具有一个或多个父类.
     * 利用 @Override修饰的方法一定重写父类的方法.
     * 使用场景:只能使用在方法上.
       * @Deprecated:标示已过时.
     * 原因:
       * Java的版本更新时,向下兼容.(工程代码最初时使用Java 1.4, 更新为1.5依旧可以)
       * 软件开发时,在新版本的软件代码中,不再不要曾经的一些方法时,使用该注解.
     * 含义:当一个方法被标识为已过时,表示一定存在一个新方法替代.(依旧使用被标识过时的方法,也可以)
     * 使用场景:用于方法、类等,一般在方法上使用.
       * @SuppressWarnings:抑制编译器警告.
     * 使用方式: @SuppressWarnings(value = { "b" })

* 自定义注解类:

  • 通过观察Java底层提供的注解内容,注解的定义类似于接口的定义.
    public @interface Override {
    String[] values() default 默认值;
    }
    * 注解类使用的是 @interface,接口使用的是 interface.
    * 注解类定义的必要属性,类似于接口中定义的方法.
    • 自定义注解类:
      • 是public修饰的.
      • 使用 @interface 关键字
        • 作用范围:用于类、方法、成员变量及局部变量等.
        • 限制注解类的注解:
        • @Target
      • 作用:指定当前自定义注解类可以应用在哪里(注解使用的范围).
      • 备选值:
        • ElementType.TYPE:指定该策略的Annotation可以修饰类、接口或枚举定义.
        • ElementType.PARAMETER:指定该策略的Annotation只能修饰参数.
        • ElementType.PACKAGE:指定该策略的Annotation只能修饰包定义.
        • ElementType.METHOD:指定该策略的Annotation只能修饰方法定义.
        • ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量.
        • ElementType.FIELD:指定该策略的Annotation只能修饰成员变量.
        • ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器.
        • ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation.
        • @Retention
      • 作用:指定当前自定义注解类的生命周期.
      • 备选值:
        • RetentionPolicy.CLASS:当前注解内容只保留在Class文件中,JVM虚拟机不能获取注解内容.
        • RetentionPolicy.RUNTIME:当前注解内容可以保留到运行,JVM虚拟机可以获取注解内容.
        • RetentionPolicy.SOURCE:当前注解内容只保留在源码中,编译后失效.
     * 生命周期由短到长:SOURCE -> CLASS -> RUNTIME
     * @Documented

3、 反射读取注解:

     * 注意:
       * 利用反射读取的注解的生命周期,一定是RUNTIME.
       * 反射与注解的父接口:
     * 反射:AnnotatedElement接口,提供反射获取注解信息的方法.
       * getAnnotation(Class<T> annotationClass)方法:获取指定注解信息.
       * getAnnotations()方法:获取所有注解信息.
       * isAnnotationPresent()方法:判断指定注解是否作用在当前元素(Class\Method\Field等)上
     * 注解:Annotation接口
       * 看具体注解作用在哪里(例如在方法上,使用Method的getAnnotation())

实例:自定义一个注解类,用于定义连接MySQL数据库使用的四个参数.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
 * 自定义一个注解类,用于定义连接MySQL数据库使用的四个参数.
 *  * driverClassName
 *  * url
 *  * username
 *  * password
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Jdbcinfo {
    String driverClassName() default "com.mysql.jdbc.Driver";

    String url();

    String username() default "root";

    String password();

}
package app.java.anno.demo;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * 封装利用JDBC连接MySQL数据库的工具类.
 * @author JYL
 */
@Jdbcinfo(password = "root", url = "jdbc:mysql://localhost:3306/day0402")
public class JDBCUtils {
    private static Jdbcinfo jdbcinfo = null;

    static {
        //利用反射读取对应注解信息
        Class<JDBCUtils> clazz1 = JDBCUtils.class;
        Class<Jdbcinfo> clazz2 = Jdbcinfo.class;

        Jdbcinfo jdbcinfo = clazz1.getAnnotation(clazz2);

        try {
            Class.forName(jdbcinfo.driverClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(jdbcinfo.url(),jdbcinfo.username(),jdbcinfo.password());
    }

    public static void close(Connection conn, Statement stmt){
        try {
            if(stmt != null){stmt.close();}
            if(conn != null){conn.close();}
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(Connection conn, Statement stmt, ResultSet rs){
        try {
            if(rs != null){rs.close();}
            if(stmt != null){stmt.close();}
            if(conn != null){conn.close();}
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java注解入门介绍

注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。...
  • lb850747906
  • lb850747906
  • 2016年08月07日 22:08
  • 2601

java注解,@,注解有什么用?

@是java注解,即annotation。 1可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。 2Java注解是附加在代码中的一些元信息,用于一些工具在编译、运...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年11月11日 14:44
  • 6545

Java 使用动态代理来动态修改注解值

java 中定义注解都是在编写代码时,如果我们想在运行中根据某个条件来修改注解的值。是无法注解操作的,但是通过动态代理是可以实现的。这里需要用到的是Proxy 动态代理第一步得到代理实例:Invoca...
  • jiangzeyin_
  • jiangzeyin_
  • 2017年11月02日 09:32
  • 463

【面试加分项】java自定义注解之解析注解

我之前的博客中说明过自定义注解的声明今天我们来看看如何对我们自己定义的注解进行解析来实现我们想要的逻辑。...
  • u010590685
  • u010590685
  • 2015年07月26日 11:57
  • 3953

秒懂,Java 注解 (Annotation)你可以这样学

文章开头先引入一处图片。 这处图片引自老罗的博客。为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的。至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明。好了,可以开始今天的博文了。 An...
  • briblue
  • briblue
  • 2017年06月27日 21:48
  • 18765

JAVAssist---动态修改注解

​ITOOV3.0开始了,需要研究一些技术难点,先来说一个我觉得比较有趣的技术点吧,需求是这样的,我们需要动态的切换数据源,又由于我们是通过实体单元的注入来完成的,实体单元是通过注解的形式注入的,这样...
  • jly4758
  • jly4758
  • 2015年03月31日 09:26
  • 12298

基于Java的容器注解@Bean

Spring框架的@Bean,@Configuration使用
  • wu631464569
  • wu631464569
  • 2016年07月19日 09:32
  • 2701

Java注解的实际应用案例讲解

前言注解确实是一个很强大的功能,是的开发效率大幅度提高。在Android开发中,比较有名气的注解框架当属:Butterknife。https://github.com/JakeWharton/butt...
  • dabaoonline
  • dabaoonline
  • 2016年08月10日 14:20
  • 873

java中注解的原理和实现机制

java中注解的实现原理和机制 一.什么是注解:      注解是标记,也可以理解成是一种应用在类、方法、参数、属性、构造器上的特殊修饰符。注解作用有以下三种:        第一种:生成文档,常用的...
  • shuaipu813
  • shuaipu813
  • 2016年10月14日 17:57
  • 4809

java注解方式参数校验

1、注解类NotEmpty.java空值校验package com.cmbc.umm.core.common.annotation;import java.lang.annotation.Docume...
  • lsziri
  • lsziri
  • 2015年05月20日 16:08
  • 5494
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java注解
举报原因:
原因补充:

(最多只允许输入30个字)