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

 

一、概念

作用:

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

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

格式:

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

用在哪里?

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

【系统注解】

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

【自定义注解】

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

【反射+注解】

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

[转帖]注解机制(Annotation,区别于comment)的更多相关文章

  1. [19/04/16-星期二] 注解机制(Annotation,区别于comment(传统意义上的注释))

    一.概念 作用: ——不是程序本身,可以对程序作出解释.(这一点和注释没什么区别) ——可以被其它程序(比如编译器)读取,这是区别于注释的最重要的一点. 格式: ——"@注释名" ...

  2. 注解【Annotation】、反射

    注解:Annotation是从JDK5.0开始引入的新技术.Annotation的作用:如果没有注解信息处理流程,则注解毫无意义)- 不是程序本身,可以对程序作出解释.(这一点,跟注释没什么区别)- ...

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

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

  4. 深入理解Spring注解机制(一):注解的搜索与处理机制

    前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...

  5. 【Android框架进阶〖0〗】ThinkAndroid注解机制

    由于项目需要,开始研究ThinkAndroid. 个人认为该框架的注解机制十分新颖,所以先研究这个,顺便学习下 Java 的annotation. 粗略的看了看,该机制在BaseActivity中初始 ...

  6. 【转】Android 最火框架XUtils之注解机制详解

    原文:http://blog.csdn.net/rain_butterfly/article/details/37931031 在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了x ...

  7. Java_注解_01_注解(Annotation)详解

    一.注解的概念 Annotation(注解)是插入代码中的元数据(元数据从metadata一词译来,就是“描述数据的数据”的意思),在JDK5.0及以后版本引入.它可以在编译期使用预编译工具进行处理, ...

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

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

  9. (转)深入理解Java注解类型(@Annotation)

    背景:在面试时候问过关于注解的问题,工作中也用到过该java的特性,但是也没有深入的了解. 秒懂,Java 注解 (Annotation)你可以这样学 ps:注解最通俗易懂的解释 注解是一系列元数据, ...

随机推荐

  1. triggerHandler(type, [data])

    triggerHandler(type, [data]) 概述 这个特别的方法将会触发指定的事件类型上所有绑定的处理函数.但不会执行浏览器默认动作,也不会产生事件冒泡. 大理石平台价格 这个方法的行为 ...

  2. windbg双机调试配置[转]

    原文 windbg已不提供单独下载,wdk驱动开发工具包里附带有这个调试器.官网提供下载: http://msdn.microsoft.com/en-us/windows/hardware/gg487 ...

  3. jquery.qrcode.js生成二维码(前端生成二维码)

    官网地址:http://jeromeetienne.github.io/jquery-qrcode/ 第一步引入插件: <script type='text/javascript' src='h ...

  4. spoj5973

    SP5973 SELTEAM - Selecting Teams #include <bits/stdc++.h> using namespace std; typedef long lo ...

  5. [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞)

    题目描述 小$Y$是一个爱好旅行的$OIer$.她来到$X$国,打算将各个城市都玩一遍.小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路.每条双向道路连接两个城市.不存在两条连接同一对城市 ...

  6. ARTS打卡计划第七周

    Algorithms: https://leetcode-cn.com/problems/longest-common-prefix/ Review: https://link.medium.com/ ...

  7. 在debian下安装QT 5.10 32位

    准备工作: 在开始之前最好把GCC升级到5.0以上. 如果升级后出现“libstdc++.so.6: version `CXXABI_1.3.9' not found”错误,可以参考https://b ...

  8. PHP ajax 实现三级联动

    在一个单独JS页面中,利用ajax实现三级联动,做成一个三级联动形式,以便于以后随时调用 JS代码: $(document).ready(function(e) { $("#sanji&qu ...

  9. Android View的加载流程

    什么是Activity? Activity是 用户操作的可视化界面:它为用户提供了一个放置视图和交互操作的窗口.采用setContentView的方法提供.因此,可以理解Activity.Window ...

  10. GIT管理以及运行规范

    继前天看分享的前后端分离后,又重新研究了GIT分支与各个环境的应用. 从开始使用git就一直有在网上查各种资料,查他的运行规范.但不知道是自己理解不够还是怎么的,一直用得不是很好. 根据自己的摸索,整 ...