自定义注解

目录

 

1注解

1.1作用

1.2 注解

1.3 内置注解

1.4 自定义注解

1.5 样例——实现ORM框架映射


1注解

1.1作用

为了简化代码,提高开发效率。

1.2 注解

jdk1.5新增新技术,注解。很多框架为了简化代码,都会提供有些注解。可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。

注解分类:内置注解(也成为元注解 jdk 自带注解)、自定义注解(Spring框架)

1.3 内置注解

 

1) @SuppressWarnings   再程序前面加上可以在javac编译中去除警告--阶段是SOURCE
(2) @Deprecated   带有标记的包,方法,字段说明其过时----阶段是SOURCE
(3)@Overricle   打上这个标记说明该方法是将父类的方法重写--阶段是SOURCE

@Overricle 案例演示

  @Override

    public String toString() {

         return null;

    }

 @ Deprecated案例演示

    new Date().parse("");

 

@ SuppressWarnings  案例演示

    @SuppressWarnings({ "all" })

    public void save() {

         java.util.List list = new ArrayList();

    }

1.4 自定义注解

元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
1) @Target

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

  1. CONSTRUCTOR:用于描述构造器
  2. FIELD:用于描述域
  3. LOCAL_VARIABLE:用于描述局部变量
  4. METHOD:用于描述方法
  5. PACKAGE:用于描述包
  6. PARAMETER:用于描述参数
  7. TYPE:用于描述类、接口(包括注解类型) 或enum声明

2)@Retention

表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效).

1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略

2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略

3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
3) @Documented

Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中.
4) @Inherited

这是一个稍微复杂的注解类型. 它指明被注解的类会自动继承. 更具体地说,如果定义注解时使用了 @Inherited 标记,然后用定义的注解来标注另一个父类, 父类又有一个子类(subclass),则父类的所有属性将被继承到它的子类中. 深入了解注解详情请参考这位大哥Java注解之Retention、Documented、Inherited介绍

1.5 样例——实现ORM框架映射

实体类和表字段不一致时,根据建立实体类到底层sql语句的映射。

实现思路:其实就是使用Java反射机制获取每个属性上的注解value值,在拼接成数据库的sql语句

//对应表的关联注解
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
    String value();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Property{
    String name();
    int length() default 0;
}

@Table("tb_student")
@Data
class Student{
    @Property(name = "student_id",length = 10)
    private String studentId;
    @Property(name = "student_name")
    private String studentName;
    @Property(name = "student_name")
    private String studentAge;

}
public class Test001 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> forName = Class.forName("com.ilose.annotation.Student");
        //获取所有当前的字段
        Field[] declaredFields = forName.getDeclaredFields();
        StringBuffer sb=new StringBuffer();
        sb.append(" select ");
        for (int i = 0; i < declaredFields.length; i++) {
            Field field = declaredFields[i];
            Property annotation = field.getDeclaredAnnotation(Property.class);
            sb.append(annotation.name());
            if(i<declaredFields.length-1){
                sb.append(" ,");
            }
        }
        //获取类注解参数
        Table declaredAnnotation = forName.getDeclaredAnnotation(Table.class);
        sb.append( " from "+declaredAnnotation.value());
        System.out.println(sb.toString());
    }
}

输出:
 select student_id ,student_name ,student_name from tb_student

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值