Java注解的学习

Java注解定义

Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称为元数据)。

Java注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

1、Java自带的标准注解

包括@Override、@Deprecated、@SuppressWarnings等,使用这些注解后编译器就会进行检查。

2、元注解

元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented、@Repeatable 等。
元注解也是Java自带的标准注解,只不过用于修饰注解,比较特殊。

3、自定义注解

用户可以根据自己的需求定义注解。

Java标准注解

JDK 中内置了以下注解:

Java元注解

元注解是java API提供的,是用于修饰注解的注解,通常用在注解的定义上:

1.@Retention

@ Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。

2.@Documented

@Documented:生成文档信息的时候保留注解,对类作辅助说明

3.@Target

@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

4.@Inherited

@Inherited:说明子类可以继承父类中的该注解

表示自动继承注解类型。 如果注解类型声明中存在 @Inherited 元注解,则注解所修饰类的所有子类都将会继承此注解。

5.@Repeatable

@Repeatable 表示注解可以重复使用。

当我们需要重复使用某个注解时,希望利用相同的注解来表现所有的形式时,我们可以借助@Repeatable注解。

创建注解:

@table注解

@FiledName注解

package com.sunjob.s95rabc.注解;
//1.注解的定义与声明
//@interface
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//2.Retention 注解有效的生命周期
//源码阶段有效,不参加代码的编译过程
@Retention(RetentionPolicy.RUNTIME)

//编译阶段有效,会参与Java源代码的编译,源码阶段有效
//@Retention(RetentionPolicy.CLASS)

//运行时有效,源码阶段有效,编译阶段有效  注解向上兼容
//@Retention(RetentionPolicy.RUNTIME)

//注解的有效范围,一个类里哪个部分有效
//3.作用范围,
// 类定义 ElementType.
// 属性定义 ElementType.FIELD
//构造方法 ElementType.CONSTRUCTOR
//方法定义ElementType.METHOD
//方法参数ElementType.PARAMETER
@Target(ElementType.TYPE)
//@Target(ElementType.PARAMETER)

public @interface Table {
//    抽象方法,没有方法体实现
//    方法名就是注解参数的名字
    String value() default "";
    String name() default "abc";
}


//注解处理器结合反射使用
package com.sunjob.s95rabc.注解;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FiledName {
//    空值可以避免不传数据
    String value() default "";
}

创建pojo类

package com.sunjob.s95rabc.注解;

import org.springframework.stereotype.Controller;

@Table(value = "t_stu")
public class Student {//类的定义

    public Student(){}//构造方法

    @FiledName("t_id")
    private String id;

    @FiledName("t_name")
    private String nickname;//属性定义

    public void sayHi(){}//方法定义

    public void sayHiforname(String nickname){}//方法定义

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

创建注解处理器

package com.sunjob.s95rabc.注解;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

//核心注解处理器 自定义注解处理逻辑
public class ORMHandler {
//    模拟数据库SQL格式
    public static String handler(Object object) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class clazz=object.getClass();

        String sql="select * from ";
//        通过反射拿到类的结构信息
//        拿到全部的注解信息
        Annotation[] annotations=clazz.getAnnotations();

        for (int i = 0; i < annotations.length; i++) {
            System.out.println(annotations[i]);

            Table annotation=(Table) annotations[i];
            sql+=annotation.value()+" ";//表明拼接
//            System.out.println(sql);
        }

//        处理FileName,一个类里面所有的属性定义
        Field[] fields =clazz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field field=fields[i];
            FiledName filedName=field.getAnnotation(FiledName.class);
            System.out.println(filedName.value());
            System.out.println(filedName.getClass().getName()+":"+filedName.value());

            if (filedName !=null){

                sql+=filedName.value()+"="+field.getName()+",";
                System.out.println(sql);
//                Object object=clazz.getDeclaredConstructor().newInstance();//创建一个student对象用于属性zhuzhi
//            使用反射打开封装权限
                field.setAccessible(true);
                field.set(object,filedName.value());
//                System.out.println(object.toString());

            }



        }
        return sql;
    }
}

测试类:

package com.sunjob.s95rabc.注解;

import java.lang.reflect.InvocationTargetException;

public class MainTest {
    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        Student zhangsan=new Student();
        String sql=ORMHandler.handler(zhangsan);
        System.out.println(sql);
        System.out.println(zhangsan.getId());

        System.out.println(zhangsan.getNickname());


    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值