(A6,一)java自定义注解

本文介绍了Java自定义注解的概念及其应用场景,并详细解析了如何使用元注解创建自定义注解,最后通过一个手动实现ORM框架的例子展示了自定义注解在实际项目中的应用。

java自定义注解


什么是注解?

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

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

什么是内置注解?

例如:

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

@ SuppressWarnings 案例演示

    @SuppressWarnings({ "all" })
    public void save() {
        java.util.List list = new ArrayList();
    }

@Deprecated 案例演示

new Date().parse("");

@Overricle 案例演示

    @Override
    public String toString() {
        return null;
    }

看图:
这里写图片描述

实现自定义注解

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

Java5.0定义的元注解:
@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声明

@Retention

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

@Documented
@Inherited
代码演示:

使用@interface 定义注解。

@Target(value={ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation{
    //注意是int类型
    int myId() default 0;
    //有default,代表这个参数可选
    String myName() default "";
    //没有default,则代表使用注解时,这个参数必写
    String [] myArrays();


}

使用自己定义的注解:

/**
 * TYPE:用于描述类、接口(包括注解类型) 或enum声明
 */
@myAnnotation(myId=1,myName="wangyongsheng",myArrays={"23","24"})
public class Test002 {

    /**
     * FIELD:用于描述域
     */
    @myAnnotation(myName="dasheng",myArrays={"23","24"})
    public String name;

    /**
     * METHOD:用于描述方法
     */
    @myAnnotation(myId=1,myArrays={"23","24"})
    public void add(){

    }

}

自定义实现ORM框架映射

手动完成案例,ORM框架实体类与表字段不一致,底层生成sql语句原理。
看下图:
这里写图片描述

自定义表映射注解
/**
 *myTable注解
 */
@Target(value=ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface myTable{
    String value();
}
/**
 *myProperty注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value=ElementType.FIELD)
@interface myProperty{

    String value();
    //有default,代表这个参数可选
    int length() default 10;
}
/**
 *MyStudent实体类
 *开始使用上面自定义的注解
 */
@myTable(value="itmayiedu_student")
class MyStudent{

    @myProperty(value="student_id",length=8)
    public String StudentId;
    @myProperty(value="student_name")
    public String StudentName;
    @myProperty(value="student_age")
    public String StudentAge;



}

public class CustomORM {

    public static void main(String[] args) throws ClassNotFoundException {
        //获取实体类的class地址
        Class<?> forName = Class.forName("com.wangys.CustomAnnotation.MyStudent");
        //定义一个拼接字符串
        StringBuffer sb=new StringBuffer();
        sb.append(" select ");
        //获取参数名
        Field[] declaredFields = forName.getDeclaredFields();
        //遍历获取
        for(int i=0;i<declaredFields.length;i++){
            Field field = declaredFields[i];

            myProperty annotation = field.getAnnotation(myProperty.class);
            //字段名称
            String propertyName = annotation.value();
            sb.append(" "+propertyName);
            if(i<declaredFields.length-1){
                sb.append(" ,");
            }
        }
        myTable declaredAnnotation = forName.getDeclaredAnnotation(myTable.class);
        //表的名称
        String tableName=declaredAnnotation.value();
        sb.append(" from "+tableName);
        System.out.println(sb.toString());
    }
}

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值