Java注解【四、自定义注解】

语法要求、元注解

  • 元注解:
    Target-适用范围;
    Retention-类型:源码注解、编译时注解、运行时注解
    Inherited-可继承(只能继承类上的注解,接口、类中的方法都不行)
    Documented-可生成文档

  • 关键字-@interface
    成员要求:
    成员类型须为基8类型,及String,Class,Annotation,Enumeration
    若注解只有一个成员,则该成员名称须为value()
    注解类也可以没有成员,即为标识注解

Demo:

public class DefAnnoDemo {
//上面4行为元注解
//Target可选,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE
@Target({ElementType.METHOD,ElementType.TYPE})//注解试用范围,方法、类
//Retention可选,SOURCE,CLASS,RUNTIME
@Retention(RetentionPolicy.RUNTIME)//属性,源码、编译时、运行时
@Inherited	//可以被继承
@Documented	//生成文档时会包含注解
//注解关键字-@interface
public @interface AnnoDemo{
	//成员类型须为基8类型,及String,Class,Annotation,Enumeration
	String Anno();	//成员须为无参无异常
	int age() default 1;	//可以用default定义默认
	//若注解只有一个成员,则该成员名称须为value()
	//int Value();
	//注解类也可以没有成员,即为标识注解
}
}

自定义注解的使用

@<注解名>(<成员名1>=<成员值1>,...)

Demo:

@AnnoDemo(Anno = "abcd", age = 18)
class Test {

@AnnoDemo(Anno = "abc")
public void test1(String[] p) {
}
}

解析注解

概念:通过反射获取类、函数的运行时注解信息,从而实现动态控制程序运行的逻辑

Demo:

    public class AnnoUseDemo {
public static void main(String[] args) {
	// 类加载
	Test t = new Test();    //将这里改为TestSon,查看@Inherited继承效果
	Class<? extends Test> c = t.getClass();
	// 判断该类是否包含AnnoDemo注解
	if (c.isAnnotationPresent(AnnoDemo.class)) {
		// 获得注解
		AnnoDemo a = (AnnoDemo) c.getAnnotation(AnnoDemo.class);
		System.out.println(a.age());
	}

	// 获取方法上的注解
	try {
		Method m = c.getMethod("test1", String[].class);
		if (m.isAnnotationPresent(AnnoDemo.class)) {
			AnnoDemo a = (AnnoDemo) m.getAnnotation(AnnoDemo.class);
			System.out.println(a.Anno());
		}
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
	} catch (SecurityException e) {
		e.printStackTrace();
	}

	// 获取所有方法注解
	Method[] ms = c.getMethods();
	for (Method method : ms) {
		if (method.isAnnotationPresent(AnnoDemo.class)) {
			AnnoDemo a = method.getAnnotation(AnnoDemo.class);
			System.out.println(a.Anno() + a.age());
		}
	}
    }
    }
    class TestSon extends Test{
@Override
public void test1(String[] p){
	
    }
    }
原文地址:https://www.cnblogs.com/shanelau/p/6625018.html