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){
	
    }
    }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号