zoukankan      html  css  js  c++  java
  • 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){
    	
        }
        }
  • 相关阅读:
    keepalived+httpd 高可用
    网卡绑定配置文件
    elk安装
    mysql数据库
    sed
    kvm
    日常巡检
    haproxy
    (6)PY_(study)
    (5)PY_(study)
  • 原文地址:https://www.cnblogs.com/shanelau/p/6625018.html
Copyright © 2011-2022 走看看