Java_注解入门介绍

纲要

Java_注解入门介绍

一.注解的长什么样

打个比方,在类或方法上上有这么个东西@Override
Java_注解入门介绍

二.注解的概念

概念:说明程序的,给计算机看的
注意:
1)JDK1.5之后的新特性
2)说明程序的作用
3)使用注解:@注解名称
4)要和注释相区分,注释是给程序员看的

三.注解的作用

①编写文档
②代码分析
③编译检查

四.JDK中自带的一些注解

@Override

作用:检测被该注解标注的方法是不是继承自父类(接口)的

@Deprecated

作用:告诉计算机,这段代码已经过时

@SuppressWarnings

作用:压制警告,消除所有警告
注意:一般传递参数“all”
比如: @SuppressWarnings(“all”)

五.自定义注解

格式

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

元注解
public @interface Override {
}

本质

public interface MyAnno extends java.lang.annotation.Annotation {
}
注解本质就是一个接口,该接口默认继承Annotation接口

属性

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro
{
    String className();
    String methodName();
}

说的直白一点,其实是里面的方法,属于叫做属性

要求

1.属性的返回值类型只允许是如下的几类
①基本数据类型
②String
③枚举
④注解
⑤以上类型的数组

2.定义的属性,使用时需要给属性赋值,如下代码:

@Pro(className = "cn.itcast.annotation.Demo1",methodName = "show")
public class ReflectTest
{

几种特殊状况
①如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性赋值。
②如果只有一个属性要赋值,并且属性的名称是value,则value可以省略,直接定义即可
③数组赋值时,要用大括号赋值(只有一个值得话,大括号可以省略)

元注解

概念:用于描述注解的注解

@Target

作用:描述注解作用的位置
参数:ElemenType取值
TYPE:可以作用在类上
METHOD:可以作用在方法上
FIELD:可以作用在成员变量上

@Retention

作用:描述注解被保留的阶段
举例
*@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到

@Document

作用:描述注解是否被抽取到api文档中

@Inherited

作用:描述注解是否可以被子类继承

六.如何在程序中使用注解

功能一:获取注解中定义的属性值

下面展示一些 直接上代码:

@Pro(className = "cn.itcast.annotation.Demo1",methodName = "show")
public class ReflectTest
{
    public static void main(String[] args) throws Exception
    {
         //可以创建任意类的对象,执行任意方法
        /*
        *   前提:不改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
        * */
        //1.解析注解
        //1.1获取该类的字节码文件对象
         Class<ReflectTest> reflectTestClass = ReflectTest.class;
         //2.获取上边的注解对象
        /*
        * public class ProImpl implements Pro
        * {
        *      public String className()
        *    {
        *         return "cn.itcast.annotation.Demo1";
        *    }
        *     public String methodName()
         *    {
         *         return "show";
         *    }
        * */
        //其实就是在内存中生成了一个该注解接口的子类实现对象
         Pro an = reflectTestClass.getAnnotation(Pro.class);
         //3.调用注解对象中定义的抽象方法,获取返回值
         String className = an.className();
         String methodName = an.methodName();
         System.out.println(className);
         System.out.println(methodName);

        //3.加载该类进内存
        Class cls = Class.forName(className); //返回一个cls对象
        //4.创建对象
        Object obj = cls.newInstance();
        //5.获取方法对象
        Method method = cls.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);
    }
}

步骤
1.获取注解定义位置的对象(Class)
2.获取指定的注解

  • getAnnotation(Class)
  • 其实内部代码就是如下这样的
     public class ProImpl implements Pro
        {
             public String className()
           {
                 return "cn.itcast.annotation.Demo1";
           }
            public String methodName()
            {
                 return "show";
            }
 //其实就是在内存中生成了一个该注解接口的子类实现对象

3.调用注解中的抽象方法获取配置的属性

上一篇:JavaScript -- 检测用户名和密码位数是否正确


下一篇:auto.js B0009 每日答题 2021-09-30