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

Posted jinanxiaolaohu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转帖]注解机制(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)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

深入理解Java的注解(Annotation):注解处理器

Annotation 注解快速入门