一、认识注解

1、注解的定义:

java提供了一种原程序中的元素关联任何信息和元数据的途径和方法。

2、学习注解的目的:

(1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的)

(2)让编程更加简洁,代码更为清晰。

3、java注解分类

(按照运行机制分)

(1)源码注解:注解只有在源码中存在,编译成.class文件就不存在了。

(2)编译时注解:注解在源码和.class文件中都存在

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

(按照来源分)

(1)来自jdk的注解

(2)来自第三方注解

(3)我们自己定义的注解

4、JDK注解(常见)

(1)@Override 表明此方法覆盖了父类的方法(使用的最多)

(2)@Deprecated 表明此方法过时了

(3)@SuppressWarnings("deprecation") 表明忽略deprecation警告

代码示例

 package Reflect;

  abstract class Father{
public abstract String name();
public abstract int age(); @Deprecated//声明此方法过时
public abstract void sing();
}
public class Test extends Father{
@Override
public String name() {
// TODO Auto-generated method stub
return null;
} @Override
public int age() {
// TODO Auto-generated method stub
return 0;
} @Override//表明覆盖了父类的方法
public void sing() {
System.out.println("Father is singing..."); }
public static void main(String[] args) { @SuppressWarnings("deprecation")//表示忽略deprecation的警告
Test t=new Test();
t.sing(); }
}

运行结果:

Father is singing...

5、常见第三方注解

spring框架、mybatis框架和hibernate框架中有大量的注解

二、自定义注解

1、元注解

(1)@Target 指明注解的作用域

@Target({ElementType.METHOD,ElemenType.TYPE})   红色部分表示作用域列表

作用域值表

作用域值 描述
CONSTRUCTOR 构造方法声明
FIELD 字段声明
LOCAL_VARIABLE 局部变量声明
METHOD 方法声明
PACKAGE 包声明
PARAMETER 参数声明
TYPE 类、接口

(2)@Retention  指明注解的生命周期

@Retention(RetentionPolicy.RUNTIME)

生命周期值表

生命周期值 描述
SOURCE 只在源码显示,编译时会丢弃
CLASS 编译时会记录到class中,运行时忽略
RUNTIME 运行时存在,可以通过反射读取

(3)@Inherited   指明注解允许自助借来继承

(4)@Documented   生成javadoc时会包含注解

2、自定义注解的语法要求

(1)成员以无参和没有异常方式声明

(2)可以用defualt为成员指定一个默认值

(3)成员类型是受限的,合法的类型包括原始类型(基本数据类型)及String,Class,Annotation,Enumeration。

(4)如果注解只有一个成员,则成员名必须取名为value,在使用的时候可以忽略成员名和赋值号(=)

(5)注解类可以没有成员,没有成员的注解称为标识注解

代码示例:(自定义一个注解)

package ANNOTATION;

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坠儿,指明作用域是方法和类接口
@Target({ElementType.METHOD,ElementType.TYPE})
//指明注解的生命周期,运行时存在
@Retention(RetentionPolicy.RUNTIME)
//指明能够被子注解继承
@Inherited
//指明生成javadoc时会包含注解
@Documented
public @interface MyAnnotation { String desc(); //成员以无参和没有异常方式声明
String author();
int age() default 18;//可以用defualt为成员指定一个默认值
}

3、使用自定义注解

使用自定义注解的语法:

@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,....)

代码示例:

package ANNOTATION;

@ MyAnnotation(desc="I am a boy",author="tom",age=21)
public class AnnotationTest { @ MyAnnotation(desc="I am a girl",author="mary",age=18)
public void girlSing(){
System.out.println("girl is singing...");
}
}

三、解析注解(读取注解中的信息,并对进行一些操作)

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

注解只会继承类上的注解,当一个类去继承一个类时,可以继承该父类已有的注解,但不能继承其父类上的注解,且接口的注解不能被继承。

代码实现:

 package ANNOTATION;

 import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws ClassNotFoundException {
//使用类加载器加载类
Class c=Class.forName("ANNOTATION.AnnotationTest");
//找到类上面的注解
boolean isExist=c.isAnnotationPresent(MyAnnotation.class);
if(isExist){
//拿到注解实例
MyAnnotation m=(MyAnnotation) c.getAnnotation(MyAnnotation.class);
System.out.println("类注解的信息:"+"desc:"+m.desc()+" author:"+m.author()+" age:"+m.age());
}
//1、获取方法上面的注解及其信息(知道方法上注解的名称)
//获取类中的所有声明的方法
Method[] method= c.getDeclaredMethods();
for (Method method2 : method) {
boolean isExist1=method2.isAnnotationPresent(MyAnnotation.class);
if(isExist1){
MyAnnotation m1=(MyAnnotation) method2.getAnnotation(MyAnnotation.class);
System.out.println(method2.getName()+"方法上注解的信息:"+"desc:"+m1.desc()+" author:"+m1.author()+" age:"+m1.age());
}
}
//2获取方法上面的所有注解及其信息
for (Method method2 : method) {
//获取方法上的所有注解
Annotation []at=method2.getAnnotations();
for (Annotation annotation : at) {
//开始解析MyAnnotation的成员值
if(annotation instanceof MyAnnotation){
MyAnnotation m3=(MyAnnotation) annotation;
System.out.println(method2.getName()+"方法上注解的信息:"+"desc:"+m3.desc()+" author:"+m3.author()+" age:"+m3.age());
}
}
/*
* 不知道方法上有哪些注释,下面代码可以获取注释的一些信息
*/
for (Method method4 : method) {
//获取方法上的所有注解
Annotation []at1=method4.getAnnotations();
for (Annotation annotation : at) {
//获取注解的Class类对象(反射)
Class c3=annotation.annotationType();
//打印注解的名称
System.out.println("注解名称:"+c3.getName());
//获取注解所有成员变量
Method [] m2=c3.getDeclaredMethods();
for (Method method3 : m2) {
System.out.println("注解的成员名称:"+method3.getName());
}
}
}
}
}
}

运行结果:

 类注解的信息:desc:I am a boy author:tom age:21
girlSing方法上注解的信息:desc:I am a girl author:mary age:18
girlSing方法上注解的信息:desc:I am a girl author:mary age:18
注解名称:ANNOTATION.MyAnnotation
注解的成员名称:desc
注解的成员名称:author
注解的成员名称:age

个人关于注解的应用理解:其实质就是对类、方法、成员变量上的注解,通过反射机制获得并进行解析,从而进一步进行操作。

java注解(基础)的更多相关文章

  1. java注解基础入门

    前言 这篇博客主要是对java注解相关的知识进行入门级的讲解,包括**,核心内容主要体现在对java注解的理解以及如何使用.希望通过写这篇博客的过程中让自己对java注解有更深入的理解,在工作中可以巧 ...

  2. Java注解基础

    0.背景 Java注解--Annotation产生于JDK5.作为code的特殊“标记”,注解可以在编译.类加载.运行时被读取,并执行处理. 开发利用注解在源码中嵌入补充信息,工具(代码分析.开发.部 ...

  3. Java注解基础概念总结

    注解的概念 注解(Annotation),也叫元数据(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就能够调用Annotations.注解与类.接口.枚举在同一个层次 ...

  4. JAVA注解基础知识

    定义-摘自JAVA编程思想 注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后某个时刻能非常方便的使用这些数据. 背景: 注解是JAVA5的一种新特性,是为应对C#等之类对JAV ...

  5. 黑马程序员:Java基础总结----java注解

    黑马程序员:Java基础总结 java注解   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...

  6. Java注解(1)-注解基础

    注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解 ...

  7. JAVA注解@Interface基础知识

    java注解是在JDK5时引入的新特性,大多数框架(SpringBoot.MyBatis.Quartz)背后都在大量使用注解开发. 一.先进行一个小试验,了解注解开发流程 建立maven项目annot ...

  8. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  9. 基础篇:深入解析JAVA注解机制

    目录 java实现注解的底层原理和概念 五种元注解详解 使用动态代理机制处理注解 spring.AOP和注解机制 (题外)@FunctionalInterface原理介绍 欢迎指正文中错误 关注公众号 ...

  10. 【Java基础】Java 注解详解

    对于Java注解,我之前的印象是很模糊的,总觉得这个东西经常听说,也经常用,但是具体是怎么回事,好像没有仔细学习过,说到注解,立马想到@Controller,仅此而已. 对于Java注解,我咨询过一些 ...

随机推荐

  1. HTML学习(三)文本格式化

    HTML文本格式化HTML 可定义很多供格式化输出的元素,比如粗体和斜体字.例1:此例演示如何在一个 HTML 文件中对文本进行格式化<html> <body> <b&g ...

  2. laravel memcached使用

    当第一次使用cache时,想用 memcached 的方式,但是它直接报错: 说明你的php没安装 memcached 这个扩展,在ubuntu下直接 sudo apt-get install mem ...

  3. Java中的Runtime类

    Runtime类描述了虚拟机一些信息.该类采用了单例设计模式,可以通过静态方法 getRuntime()获取Runtime类实例.下面演示了获取虚拟机的内存信息: package Main; publ ...

  4. C++中string

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...

  5. IOS开发-UI学习-使用代码创建button

    使用代码创建button分5个步骤,分别是: 1.定义一个按钮,根据定义位置不同可定义为局部变量或者全局变量: 2.初始化按钮,一般使用一个矩形初始化: 3.设置按钮控件的其他属性,如背景图片,或者背 ...

  6. Less-css预处理编译

    node编译 第一步:https://nodejs.org/en/  到node官网下载最新的node 第二步:和普通软件一样把node安装好 第三步:运行-cmd,准备安装less 全局安装(整个电 ...

  7. OI队内测试一【数论概率期望】

    版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...

  8. xamarin mac 基础知识 之 界面

    有两种方式创建界面:代码和xaml

  9. java 类中的属性为什么一般都是私有的

    作为一种规范,所有可能被外部访问的可修改变量,都应该有一对对应的getXXX()和setXXX()的存取方法.保证所有对属性值的存取操作,均通过唯一的途径进行. 而我们一般使用private来作这种信 ...

  10. yum命令被锁 Existing lock /var/run/yum.pid

    有时使用yum命令,不知怎会回事就提示: Existing lock /var/run/yum.pid: another copy is running as... 感觉也没操作什么错误的事情. 此时 ...