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());
}
}