zoukankan      html  css  js  c++  java
  • Java 注解入门实例 && 注解传參

    參考
    概念:java提供了一种原程序中的元素关联不论什么信息和不论什么元数据的途径和方法
    JDK内置系统注解
    @Override 用于修饰此方法覆盖了父类的方法;
    @Deprecated 用于修饰已经过时的方法;
    @Suppvisewarnings 用于通知java编译器禁止特定的编译警告。
    常见注解
    注解依照执行机制划分
    源代码注解:注解仅仅在源代码中存在,编译成.class文件就不存在了;
    编译时注解:注解在源代码和.class文件里都存在(例:JDK自带注解);
    执行时注解:在执行阶段还起作用,甚至会影响执行逻辑的注解(Autowired);
    自己定义注解的元注解

    1. @Target—作用域(constructor(构造方法声明),field(字段声明)。local_variable(局部变量声明),method(方法声明)。package(包声明),parameter(參数声明),type(类,接口声明))
    2. @Retention—生命周期(source:仅仅在源代码显示,编译时会丢弃。

      class:编译时会记录到class中。执行时忽略。runtime:执行时存在。能够通过反射读取)

    3. Inherited—标识注解(同意子类继承)
    4. Documented—生成Javadoc
    5. 若成员仅仅有一个,必须为value,这个參数赋值能够不写value=XXX

    自己定义语法
    使用自己定义
    成员以无參无异常方式声明。

    成员类型是受限的,合法的类型包含原始类型及String,Class,Annotation, Enumeration.

    上面用了注解,程序中获得注解信息的方法是反射


    Class cls = Class.forName(“”);//使用类载入器载入类
    cls.isAnnotationPresent(xx.class);//推断cls这个类上是否有xx的注解,找到类上注解
    xx a = (xx)cls.getAnnotation(xx.class);//取得其上的注解

    以下附一个实例。是框架怎样使用注解描写叙述參数。


    结构图
    这里写图片描写叙述

    A.java

    package javaBasic;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.PARAMETER ,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface A {
        String value();
        String name() default "bingone";
        int age() default 20;
    }
    

    B.java

    package javaBasic;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.PARAMETER ,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface B {
        String value();
        String name() default "bingone";
    
    }
    

    DataClass.java

    package javaBasic;
    
    public class DataClass {
        public String name;
        public int age;
        public DataClass(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
    }
    

    RunClass.java

    package javaBasic;
    
    public class RunClass {
        public static void run(@A("str") String str,@B("age")int age){
            System.out.println("In run Method str:" + str + "age:" + age);
        }
    }
    

    TestClass.java

    package javaBasic;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    /**
     * 通过注解传參数
     * @author gg_gogoing
     *
     */
    public class TestClass {
        public static void parseMethod(DataClass data,Object obj,String mthname){
            //验证是否有注解
            //若有则两种方法:
            //1. 在编译时刻已经有了相应的表,查表就可以
            //2. 例如以下的遍历方式。

    if(obj instanceof RunClass){ String str = null; int age = 0; Method [] methods = (Method[])obj.getClass().getMethods(); for(Method method :methods){ if(method.getName().equals(mthname)){ Annotation[][] annotations = method.getParameterAnnotations(); for(Annotation[] tt : annotations){ for(Annotation t:tt){ if(t instanceof A){ str = data.name; }else if(t instanceof B){ age = data.age; } } } RunClass.run(str, age); } } } } public static void main(String[] args) throws Exception, RuntimeException { // 主方法 //不直接传參数,而是将一个类中的数据传入 DataClass dc = new DataClass("gg_gogoing", 20); parseMethod(dc, new RunClass(), "run"); } }

    附一张大图

  • 相关阅读:
    java se 转到ee小结
    objective c基本知识
    2013_11_14:递归算法(2)—全排列
    2013_11_13:递归算法(1)
    2013_11_13:关于 new 和delelte 的使用
    c++调试问题
    模式匹配BM算法介绍与实现
    一个n数组求和问题
    机试题
    算法题目
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7149698.html
Copyright © 2011-2022 走看看