28.注解2.md


目录

1. 特点

  • 注释:给程序员阅读使用
  • 注解:给编译器阅读使用

2.优点

  • 简化配置文件
  • 灵活方便

3. 源注解-部分

//修饰范围
@Target({ElementType.TYPE,             //类
         ElementType.FIELD,            //字段
         ElementType.METHOD,           //方法
         ElementType.PARAMETER,        //参数
         ElementType.CONSTRUCTOR,      //构造
         ElementType.LOCAL_VARIABLE})  //局部变量
//有效范围
@Retention(value = RetentionPolicy.SOURCE) //Annotation只保留在源代码中,编译器直接丢弃这种Annotation。
@Retention(value = RetentionPolicy.CLASS)  //编译器把Annotation记录到class文件中,当运行Java程序时候,JVM不能获取Annotation信息,这个是默认值。
@Retention(value = RetentionPolicy.RUNTIME)  //编译器把Annotation记录到class文件中,当运行Java时,JVM也可以获取Annotation信息,程序可以通过反射获取该Annotation信息。  

4.自定义注解

  • 自定义注解关键字:@interface
  • 注解使用时候注意只能定义方法
  • 注解可以用default来写默认值
  • 注解方法不能有实体
  • 只有一个属性时候可以不写名称
package per.liyue.code.teset;
/*
 * 注解的使用
 */
public @interface MyAn {
    //数字
    int id();
    //字符
    String name();
    //默认值
    String com() default "";
    //默认值
    long time() default 9L;
    //数组
    int[] a();
    //字符串数组
    String[] ss();
    //如果只有一个熟悉,且名字为value时候可以不写名称
    //String value();
}  

package per.liyue.code.teset;
/*
 * 一个注解的例子
 */
//注解可以写到这里
@MyAn(id=1, name="hah", a={1, 2}, ss={"aa", "bb"})
public class demo1 {
    //需要将注解内容都写出来
    @MyAn(id=1, name="hah", com="sss", time=8l, a={1, 2}, ss={"aa", "bb"})
    public void Fun(){}
    
    //某些注解使用默认值
    @MyAn(id=1, name="hah", a={1, 2}, ss={"aa", "bb"})
    public void Fun1(){}
    
}

5.使用注解获

Demo:

package per.liyue.code.annotion_demo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
/*
 * 自定义注解
 */
//修饰范围
@Target({ElementType.TYPE,             //类
         ElementType.FIELD,            //字段
         ElementType.METHOD,           //方法
         ElementType.PARAMETER,        //参数
         ElementType.CONSTRUCTOR,      //构造
         ElementType.LOCAL_VARIABLE})  //局部变量
//有效范围
//@Retention(value = RetentionPolicy.SOURCE) //Annotation只保留在源代码中,编译器直接丢弃这种Annotation。
//@Retention(value = RetentionPolicy.CLASS)  //编译器把Annotation记录到class文件中,当运行Java程序时候,JVM不能获取Annotation信息,这个是默认值。
@Retention(value = RetentionPolicy.RUNTIME)  //编译器把Annotation记录到class文件中,当运行Java时,JVM也可以获取Annotation信息,程序可以通过反射获取该Annotation信息。
public @interface Person {
    int age() default 20;
    String name()    default "叫啥来";
}
package per.liyue.code.annotion_demo;
/*
 * 使用注解的类
 */
public class Employee {
    @Person(age = 30, name = "张三")
    public void funE(){
        
    }
}
package per.liyue.code.annotion_demo;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
import org.junit.Test;
/*
 * 获取注解使用注解
 */
public class UsePerson {
    @Test
    public void Fun() throws NoSuchMethodException, SecurityException, ClassNotFoundException{
        /*
         * 获取注解信息
         */
        //先获取到类
        //Class clazz = Class.forName("per.liyue.code.annotion_demo.Employee");
        Class clazz = Employee.class;
        
        //获取到方法
        Method m = clazz.getMethod("funE");
        
        //获取方法上的注解
        Person p = m.getAnnotation(Person.class);
        
        //输出
        System.out.println("这个员工的年龄:" + p.age() + " 名字:" + p.name());
    }
}
原文地址:https://www.cnblogs.com/bugstar/p/8492850.html