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

 

一、概念

作用:

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

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

格式:

——"@注释名" ,还可以添加一些参数,例如@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();

}

[转帖]注解机制(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. Windows:获取本地时间

    造冰箱的大熊猫@cnblogs 2019/6/4 #include <windows.h> int func() { SYSTEMTIME systime; GetLocalTime ( ...

  2. JS学习-01

    01

  3. codeforces364D

    Ghd CodeForces - 364D John Doe offered his sister Jane Doe find the gcd of some set of numbers a. Gc ...

  4. python控制窗口移动(轨迹为圆)

    需先打开一个无标题记事本, import win32con import win32gui import time import math notepad = win32gui.FindWindow( ...

  5. 【面试】ArrayList 和 HaseMap 的区别和应用场景

    ArrayLiat: ArrayList array = new ArrayList(); array.add("张三"); array.add("李四"); ...

  6. Int和Integer(课上测试)

    截图 第一段代码: 第二段代码: 两段代码出现不同结果的原因:Integer类型的取值范围为-128至128之间,小于128的数(图1)为正确,大于128的数(图2)为错误

  7. git status: HEAD detached from origin/master问题的解决

    问题:执行git status,提示: HEAD detached from origin/master 原因:分支选错了,后续的提交都提交到了一个匿名分支之上,整个状态是游离了的 解决方法: 1.查 ...

  8. [学习]sentinel中的DatatSource(一) ReadableDataSource

    sentinel是今年阿里开源的高可用防护的流量管理框架. git地址:https://github.com/alibaba/Sentinel wiki:https://github.com/alib ...

  9. jeecg中列表点击单号跳入链接

    效果如图:点击单号,跳到一个新的页面 1.首先列表给一个自定义的js: <t:dgCol title="业务编号"  field="orderCode" ...

  10. display:flex 布局详解(2)

    1.  flex设置元素垂直居中对齐 在之前的一篇文章中记载过如何垂直居中对齐,方法有很多,但是在学习了flex布局之后,垂直居中更加容易实现 HTML代码: <div class=" ...