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){
    	
        }
        }
  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/shanelau/p/6625018.html
Copyright © 2011-2022 走看看