一、概念

作用:

——不是程序本身,可以对程序作出解释。(这一点和注释没什么区别)

——可以被其它程序(比如编译器)读取,这是区别于注释的最重要的一点。

格式:

——"@注释名" ,还可以添加一些参数,例如@SuppressWarnings(Value="unchecked")

用在哪里?

——可以附加在package(包)、class(类)、method(方法)、field(属性),相当于给他们添加额外的辅助信息,可以通过反射机制编程实现对这些元数据的访问

【系统注解】

/***
* 学习注解
*/
package cn.sxt.jvm; import java.util.*; public class Test_0416_Annotation {
public static void main(String[] args) {
System.out.println("hello");
Date date=new Date();
//date.parse("dd");//jar中加了中划线,表示不推荐使用 ,源码中会有这个@Deprecated
test01();//自己写的 ,不建议使用不是不能使用 } /*注解1、@Override 表示重写父类的方法 如果不加@Override,把toString()写成tostring()【大小写拼错】
编译器是不会报错的,只会把它当成一个自己写的普通方法,但是加了@Override会报错,编译器会去父类的方法中(默认继承Object类)
寻找有没有这个方法,如果没有则会报错!。只用于方法的前边*/
@Override //英文:覆盖,重写
public String toString() {//重写toString方法
return "爱你";
} /*注解2、@Deprecated 不赞成使用的方法或者类,自己写的类也可以加上。不是不能使用
*/
@Deprecated //英文:反对,不赞成
public static void test01() {
System.out.println("不建议使用,不是不能使用!");
} /*注解3、@SuppressWarnings("all"),如果没有这个,下边没有用到的语句或其他情况左边会有黄色警告。
* 可以用在包、类、方法、属性的前边
*/
@SuppressWarnings("all") //Suppress镇压.翻译:抑制由此以下的一切警告 .
private void test02() {
java.util.List list=new ArrayList(); } //自己定义的注解,也可以在注解中更改默认设置
@Test_0416_SxtAnnotation (studentName="小李",id=1001,age=18,schools="武汉大学")
private void test03() { }
}

【自定义注解】

/***
* 自定义一个注解
*/
package cn.sxt.jvm; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target (value=ElementType.METHOD) //元注解1 Target:[英文]目标,服务对象,靶子。表示自定义的注解只能用于方法前边
//@Target(value={ElementType.METHOD,ElementType.TYPE}) 表示这个注解可以用于方法和类的前边 @Retention(RetentionPolicy.RUNTIME)//元注解2 Retention[英文]保留 有3个级别。
//SOURCE,在源文件中有效;ClASS,在class文件中有效;RUNTIME运行时有效,为Runtime可以被反射机制读取,级别最高。 public @interface Test_0416_SxtAnnotation {
String studentName() default "";//加了默认值
int age() default 0;
int id() default -1; //默认值-1 String[] schools() default {"清华大学","北京大学"}; //数组 //String value(); 如果注解只有一个属性,通常这样定义,属性名定义为value,假设新注解为Test_0416_SxtAnnotation02
//用的时候直接这样Test_0416_SxtAnnotation02(value="小李")或者Test_0416_SxtAnnotation02("小李")
//由于注解时没有设置默认值,所以使用时必须给它一个值 }

【反射+注解】

/***
* ORM:Object relationship Mapping 对象关系映射
* Java中的类与数据库中关系表相对应
* -类与表结构对应
* -属性与子段对应
* -对象与记录对应
*
* 学习使用注解完成类和表结构的映射关系
*/
package cn.sxt.jvm; @Test_0416_OrmAnnotation("tb_student") //与tb_student这个表对应
public class Test_0416_ORM { @Test_0416_OrmAnnotationField(columnName="id",type="int",length=10)//对应于表中的各项数据
private int id;
@Test_0416_OrmAnnotationField(columnName="sname",type="varchar",length=10)
private String stuName;
@Test_0416_OrmAnnotationField(columnName="age",type="int",length=3)
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getStuName() {
return stuName;
} public void setStuName(String stuName) {
this.stuName = stuName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }
/***
* 使用反射解析注解信息,模拟处理注释信息的流程,实际用的是各种框架去解析,不用自己写
*/
package cn.sxt.jvm; import java.lang.annotation.Annotation;
import java.lang.reflect.Field; public class Test_0416_OrmReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Class clz=Class.forName("cn.sxt.jvm.Test_0416_ORM");// clz这个对象包含了Test_0416_ORM这个类的全部信息(包括注解)
Annotation[] annotation= clz.getAnnotations();//获得Test_0416_ORM这个类全部的注解 for (Annotation ann : annotation) {
System.out.println(ann);//输出这个类上边的注解 @Test_0416_OrmAnnotation("tb_student")
} //直接通过类名获得注解 Test_0416_OrmAnnotation为写的一个注解
Test_0416_OrmAnnotation st=(Test_0416_OrmAnnotation)clz.getAnnotation(Test_0416_OrmAnnotation.class);
System.out.println(st.value()); //获得类的属性的注解,以stuName的注解为例,在实际应用中获取的是数据库表的相关信息
Field f=clz.getDeclaredField("stuName");
Test_0416_OrmAnnotationField field=f.getAnnotation(Test_0416_OrmAnnotationField.class);
System.out.println(field.columnName()+"->"+field.type()+"->"+field.length()); //然后根据获得表名和字段信息,拼出DDL(Data Definition Language,数据库模式定义语言)语句 (相关的SQL语句),然后使用
//JDBC执行这个SQL,然后在数据库中生成相关的表。此处省略
} }
/***
* 配套注解 注解类
*/
package cn.sxt.jvm; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target (value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) public @interface Test_0416_OrmAnnotation {
String value();//只有一个属性,用于与某个表对应 } /***
* 注解属性
*/
package cn.sxt.jvm;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target (value=ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME) public @interface Test_0416_OrmAnnotationField {
String columnName();//列名
String type();
int length(); }

[19/04/16-星期二] 注解机制(Annotation,区别于comment(传统意义上的注释))的更多相关文章

  1. [转帖]注解机制(Annotation,区别于comment)

    [19/04/16-星期二] 注解机制(Annotation,区别于comment(传统意义上的注释))   一.概念 作用: ——不是程序本身,可以对程序作出解释.(这一点和注释没什么区别) ——可 ...

  2. [2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

    转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习 ...

  3. Java核心知识体系2:注解机制详解

    1 Java注解基础 注解是JDK1.5版本开始引入的一个特性,用于对程序代码的说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解. 它主要的作用有以下四方面: 生成javadoc文档,通过 ...

  4. 深入理解Java:注解(Annotation)--注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  5. Java注解实践--annotation学习三

    注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK 基本Annotation 注解 说明 @O ...

  6. Java注解(Annotation):请不要小看我!

    Java注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分.注解对于代码的运行效果没有直接影响. 网络上对注解的解释过于严肃.刻板,这并不是我喜欢的风格.尽管这样的 ...

  7. 【转】深入理解Java:注解(Annotation)--注解处理器

    https://www.cnblogs.com/peida/archive/2013/04/26/3038503.html 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解 ...

  8. [3] 注解(Annotation)-- 深入理解Java:注解(Annotation)--注解处理器

    转载 http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html 深入理解Java:注解(Annotation)--注解处理器 如果没有用 ...

  9. 深入理解Java:注解(Annotation)自己定义注解入门

    深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的 ...

随机推荐

  1. [linux] C语言Linux系统编程进程基本概念

    1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...

  2. ckeditor添加自定义按钮整合swfupload实现批量上传图片

    ckeditor添加自定义按钮整合swfupload实现批量上传图片给ckeditor添加自定义按钮,由于ckeditor只能上传一张图片,如果要上传多张图片就要结合ckfinder,而ckfinde ...

  3. MySQL 数据类型总结及选取准则

    整数 整数有 TINYINT, SMALLINT, MEDIUMINT, INT 和 BIGINT 类型. 占用    8          ,  16            24,          ...

  4. 解决:springmvc maven 项目搭建完后没有src目录,而且maven导入很慢

    前言:在搭建springmvc maven项目中遇到的问题做总结,比如搭建后没有src,同时这里也解决了搭建后maven导入很慢的问题. 问题: 1.发现创建出来的maven项目没有src文件 ,而且 ...

  5. 一个简单IOC与DI示例

    1.通过bean工厂实现读取xml文件,并实例化对象,实现自动注入. package com.pri.test; import com.pri.factory.BeanFactory; import ...

  6. Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动

    一.Result结果配置 1.全局和局部结果 ​ 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...

  7. java设计模式-观察者模式,装饰者模式

    1.1定义 慨念:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 即:主题和观察者定义了一对多的关系,观察者依赖于主题,只要主题发生变化,观察者就 ...

  8. javascrip 实现简单的计算器功能

    页面样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  9. 理解position:relative

    前言:position有5个属性:static.absolute.relative.fixed和inherit.本篇博客主要介绍relative属性,因为似乎很多人对这个属性的理解很模糊,而且不清楚r ...

  10. Ubuntu16.04 下安装tomcat

    有两种常用方法: 一.通过 apt-get 命令进行在线安装(会自动配置好环境变量和服务) 二.通过下载并解压 .tar.gz 包进行手动安装(需要手动配置环境变量) 一.通过 apt-get 命令进 ...