Java注解

Java注解概念

         注解,也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举在同一层次。它可以声明在包、类、字段、方法、局部变量、方法参数前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档
② 代码分析:通过代码里标识的元数据对代码进行分析
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查

Java内置注解

1.@Override
         它的作用是对覆盖超类中的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。
在这里插入图片描述
2.@Deprecated
         它的作用是对不应该再使用的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@Deprecated标记具有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数。
在这里插入图片描述
3.@SuppressWarnings
其参数有:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当 switch 程序块直接通往下一种情况而没有 break 时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少serialVersionUID 定义时的警告
finally ,任何 finally 子句不能正常完成时的警告
all,关于以上所有情况的警告

Java自定义注解

格式:
     元注解
     public @Interface 注解名称{}

package com.fengxunxinxi.annotition;

public @interface MyAnno {
}

使用注解

package com.fengxunxinxi.annotition;

public class AnnoDemo {

    @MyAnno
    public void show(){

    }
}

反编译注解
在这里插入图片描述
编译成class文件
在这里插入图片描述
在这里插入图片描述
反编译
在这里插入图片描述

public interface MyAnno extends java.lang.annotation.Annotation {
}

注解本质上就是一个接口,该接口默认继承Annotation接口。
属性:接口中可以定义的成员方法
1.属性的返回值类型
基本数据类型
String
枚举
注解
以上类型的数组
2.定义了属性,在使用是需要给属性赋值
如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义即可。
数组赋值时,值使用{}包裹,如果数组只有一个值,{}可以省略。
元注解:用于描述注解的注解
@Target:描述注解的作用位置
  ElementType取值:
    TYPE:可以作用于类上
    METHOD:可以作用于方法上
    FIELD:可以作用于成员变量上
@Retention:描述注解的保留阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承

Java解析注解

1.定义一个@Pro注解

package com.fengxunxinxi.annotition;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 描述需要执行的类名,方法名
 */

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {

    String className();
    String methodName();
}

定义一个ReflectTest类,在类上添加注解,给注解属性赋值

package com.fengxunxinxi.annotition;



import java.lang.reflect.Method;

@Pro(className = "com.fengxunxinxi.annotition.Demo",methodName = "show")
public class ReflectTest {

    public static void main(String[] args) {
        /**
         * 获取改类的字节码文件
         */
        Class<ReflectTest> reflectTestClass=ReflectTest.class;
        /**
         * 获取上面的注解对象,会在内存中生成一个该接口的子类实现对象
         */
        Pro an=reflectTestClass.getAnnotation(Pro.class);
        /**
         * 使用注解中定义的抽象方法,获取返回值
         */
        String className=an.className();
        String methodName=an.methodName();
        System.out.println(className);
        System.out.println(methodName);

        /**
         * 加载该类进入内存
         */
        try {
            Class cls = Class.forName(className);
            /**
             * 创建对象
             */
            Object obj=cls.newInstance();
            /**
             * 获取方法对象
             */
            Method method=cls.getMethod(methodName);
            /**
             * 执行方法
             */
            method.invoke(obj);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

属性的值为要执行的方法和方法所在的类

package com.fengxunxinxi.annotition;

public class Demo {

    public void show(){
        System.out.println("demo.....show...");
    }
}

执行主函数
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值