java 自定义注解

1.注解分类
(1).按运行机制分类
     1.源码注解  只在源码中存在  元注解@Retention(生命周期)中为SOURCE
     2.编译注解  存在源码和class文件中  @Retention 中为CLASS
     3.运行注解  运行阶段起作用,影响运行编辑  @Retention 中为RUNTIME
(2).按来源分类
     1.jdk注解
     2.第三方注解
     3.自定义注解
2.注解使用
    1.定义一个注解类
      再注解类上添加源注解
          @Target 定义注解的作用域 ElementType.
                  CONSTRUCTOR 构造方法声明
                  FIELD  字段声明
                  LOCAL_VARIABLE 局部变量声明
                  METHOD 方法声明
                  PACKAGE 包声明
                  PARAMETER 多线声明
                  TYPE 类、接口声明
      @Retention 定义注解生命周期 RetentionPolicy.
                  SOURCE 源码注解
                  CLASS  编译注解
                  RUNTIME 运行注解
          @Inherited 有代表允许子类继承,标识性注解(不存在成员变量的注解)可有可无
          @Documented  代表生成java doc文件的时候包含此注解
        2.注解类定义
          标识性注解:不存在成员变量的注解;
          只有一个成员变量的注解,这个成员必须是value,使用是时候可以省略value和等于符号;
          成员类型:八大基本类型及String、Class、Annotation、Enumeration等原始类型
          注解成员无参数无异常;
          成员可以通过  default给定默认值;
        3.解析注解
          概念:通过反射获取类、函数或成员上的运行注解性息,从而实现动态空值程序的运行逻辑。
          步骤:
          1.使用类加载器获取需要解析的类
              Class c=Class.forName("my.test.Usser");  Usser注解使用类
              2.找到类上面的注解,拿到注解实例
              boolean isExist=c.isAnnotationPresent(User.class);  User.class注解类名,判断类是否存在注解
              User user=(User) c.getAnnotation(User.class);
              3.通过注解成员获取成员值

              String name=user.name();

package my.excal;


import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface User {
	String name() default "你好";
	int age();
}
package my.test;

import my.excal.User;
@User(name="你妹",age=33) 
public class Usser {
	
}

package my.test;

import my.excal.User;

public class Test1 {
public static void main(String[] args) {
	try {
		Class c=Class.forName("my.test.Usser");
		boolean isExist=c.isAnnotationPresent(User.class);
		if(isExist){
			User user=c.getAnnotation(User.class);
			String name=user.name();
			Integer age=user.age();
			System.out.println(name);
			System.out.println(age);
		}
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
}


你可能感兴趣的:(java,java,自定义注解)