A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小江哥 黑马粉丝团   /  2019-9-28 16:54  /  1169 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前言
Java的Annotation是在5.0版本之后引入的,可以用于创建文档,跟踪代码中的依赖性,并且可以执行编译时期检查。注解就是给虚拟机看的,代表程序的一些特殊的功能。JDK中提供了@Override,@SuppressWarning,@Deprecated三种注解,当让还有元注@Target,@Retention,@Documented,@Inherited,元注解的作用负责注解其它注解。要想了解注解,就要了解自定义注解,了解是通过反射来实现的。
**注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。

元注解

元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种

@Inherited:说明子类可以继承父类中的该注解
@Document:说明该注解将被包含在javadoc中

@Target:注解的作用目标

[Java] 纯文本查看 复制代码
@Target(ElementType.TYPE)   //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR)  //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

@Retention:注解的保留位置

[Java] 纯文本查看 复制代码
@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

小例子:

1.自己定义一个注解

[Java] 纯文本查看 复制代码
package com.Test;
 
import java.lang.annotation.*;
 
/**
 * @Author: cxx
 * @Date: 2018/3/15 11:47
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Cxx {
    String value() default "haha";
 
}

2.写一个测试demo

[Java] 纯文本查看 复制代码
package com.Test;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
/**
 * @Author: cxx
 * @Date: 2018/3/15 12:14
 */
public class CxxTest {
    @Cxx(value = "test1")
    public void test1(){
        System.out.println("test1()方法");
    }
    @Cxx("test2")
    public void test2(){
        System.out.println("test2()方法");
    }
 
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Class clazz = CxxTest.class;
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            boolean flag = method.isAnnotationPresent(Cxx.class);
            if (flag){
                Cxx c = method.getAnnotation(Cxx.class);
                System.out.println(c.value());
//                method.invoke(clazz.getInterfaces(),args);
            }
        }
    }
}

之后我们就能看到运行结果中test1,test2都打印出来了

这里再介绍invok的用法:

首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数

[Java] 纯文本查看 复制代码
  public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, InstantiationException {
        Class clazz = CxxTest.class;
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            boolean flag = method.isAnnotationPresent(Cxx.class);
            if (flag){
                Cxx c = method.getAnnotation(Cxx.class);
                System.out.println("注解传入的参数:"+c.value());
                method.invoke(clazz.newInstance());
            }
        }
    }

转载:https://blog.csdn.net/m0_37499059/article/details/79566241



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马