个人简介
- 大家好,我是韩慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
- 欢迎点赞+收藏+留言💜
- 喜欢得不一定想得到,想得到的一定很喜欢🧡
一、注解
概述:Java注解又称Java标注;Java语言中的类、构造器、方法、成员变量、参数都可以被注解进行标注。
作用:对Java中类、方法、成员变量做标记,然后进行特殊处理。
自定义注解格式:
特殊属性:
- value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写
- 如果有多个属性,且多个属性没有默认值,那么value名称是不能省略的
理解:就是看有几个没有默认值的属性,若只有一个,属性名称可以省略的;否则,不能省略。
package com.itheima_01.Annotation;
/**
* @author hanhan
* date 2022/5/3 16:39
* 努力已经来不及了,你得拼命
* 自定义注解
*/
@aa(age=18,sex="nv")
public class AnnotationDemo_0 {
@aa(age=18,sex="nv")//标注成员变量
String a;
public static void main(String[] args) {
@aa(age=18,sex="nv")//标注局部变量
int b;
}
}
@interface aa{
String name() default "hhhhh";//设置默认值
int age();
String sex();
}
二、元注解
元注解就是放在注解上的注解。
常见的元注解:
- @Target:约束自定义注解只能在某些地方使用
package com.itheima_01.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @author hanhan
* date 2022/5/3 17:13
* 努力已经来不及了,你得拼命
* 认识元注解
*/
public class AnnotationDemo_01 {
@bb//此时就会报错,因为元注解规定了只能注解构造器和方法
String name;
String sex;
int age;
@bb
public AnnotationDemo_01(){
}
@bb
public void eat(){
System.out.println("狂吃不胖");
}
}
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})//元注解;规定该注解只能在构造器和方法使用
@interface bb{
}
2. @Retention:申明注解的声命周期
package com.itheima_01.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author hanhan
* date 2022/5/3 17:13
* 努力已经来不及了,你得拼命
* 认识元注解
*/
public class AnnotationDemo_01 {
@bb//此时就会报错,因为元注解规定了只能注解构造器和方法
String name;
String sex;
int age;
@bb
public AnnotationDemo_01(){
}
@bb
public void eat(){
System.out.println("狂吃不胖");
}
}
@Retention(RetentionPolicy.RUNTIME)//元注解,声明该注解的周期 注解bb作用在源码阶段、文件阶段、运行阶段
@interface bb{
}
三、注解解析
概述:注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容。Annotation是注解的顶级接口,注解都是Annotation类型的对象;AnnotationElement接口定义了与注解解析相关的解析方法
注意:所有的类成分Class,Method,Field,Constructor都实现了AnnotationElement接口,都具有注解解析的能力。
package com.itheima_01.Annotation;
import java.lang.annotation.*;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* @author hanhan
* date 2022/5/3 19:51
* 努力已经来不及了,你得拼命
* 解析注解
*/
public class AnnotationDemo_02 {
public static void main(String[] args) throws NoSuchMethodException {
//先创建类对象
Class bookStoreClass = BookStore.class;
Method see = bookStoreClass.getDeclaredMethod("see");
//判断该类是否存在这个注解
if(bookStoreClass.isAnnotationPresent(Book.class)){
//获取该注解
Book declaredAnnotation = (Book) bookStoreClass.getDeclaredAnnotation(Book.class);
System.out.println(declaredAnnotation.name());
System.out.println(declaredAnnotation.price());
System.out.println(Arrays.toString(declaredAnnotation.author()));
}
if(see.isAnnotationPresent(Book.class)){
Book declaredAnnotation = see.getDeclaredAnnotation(Book.class);
System.out.println(declaredAnnotation.name());
System.out.println(declaredAnnotation.price());
System.out.println(Arrays.toString(declaredAnnotation.author()));
}
}
}
@Target({ElementType.TYPE,ElementType.METHOD})//元注解,该注解只能注解类和方法
@Retention(RetentionPolicy.RUNTIME)//元注解 声明该注解的存在周期
@interface Book{
String name();
double price() default 100;
String[] author();
}
@Book(name="《Java编程思想》",price = 99.1,author = {"a","b","c"})
class BookStore{
@Book(name="《Java从入门到入土》",author = {"aa,bb,cc"})
public void see(){
}
}
四、注解的应用
案例:模拟Junit框架
需求:定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行
package com.itheima_01.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
/**
* @author hanhan
* date 2022/5/3 20:31
* 努力已经来不及了,你得拼命
*/
public class AnnotationDemo_03 {
@MyTest
public void test1(){
System.out.println("test1执行");
}
@MyTest
public void test2(){
System.out.println("test2执行了");
}
@MyTest
public void test3(){
System.out.println("test3执行了");
}
//实现调用有注解的
public static void main(String[] args) throws Exception {
AnnotationDemo_03 annotationDemo_03 = new AnnotationDemo_03();
Class annotationDemo_03Class = AnnotationDemo_03.class;
Method[] declaredMethods = annotationDemo_03Class.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
if(declaredMethod.isAnnotationPresent(MyTest.class)){
declaredMethod.invoke(annotationDemo_03);
}
}
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyTest{
}