java注解的学习

it2024-03-18  59

注解 jdk1.5之后的特性 可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释。 @加注解名称 作用分类: 1.编写文档(生成doc文档) 2.代码分析 3.编译检查(override等)

jdk内置的注解 1.@override 检测被该注解标注的方法是否继承自父类(父接口)

public class demo{ @Override public String toString() { return super.toString(); } }

2.@Deprecated 该注解标注的内容已过时

public class demo{ @Deprecated public void show(){ //有缺陷 } public void show2(){ //替代show } public void doi(){ show(); } }

这里调用show()时这个函数上会被划上横线 3.@SuppressWarnings 压制警告 使用@SuppressWarnings(“all”)压制所有警告 自定义注解 格式: 元注解 public @interface 注解名称{}

* *本质:注解本质是一个接口,该接口默认继承Annotation接口 * public interface myAnno extends java.lang.annotation{} * 接口中可以定义常量,抽象方法 * 返回值类型:基本数据类型,String,枚举,注解,以上类型的数组,不能是void,不能是类 * 使用自定义注解时要给属性赋值 * 如果只有一个属性需要赋值,而且这个属性叫value,那么可以直接赋值,不写value=什么什么 * 数组赋值时,值使用{}包裹,如果只有一个值可以不用大括号 */ public @interface myAnno{ String show(); int age() default 12; } @myAnno(show = "afdd") public class worker{ }

元注解是用来注解注解的注解 如@Target:描述注解作用的位置 @Retention:描述注解被保留的阶段 @Documented:描述注解是否被抽取到api文档中 @Inherited:描述注解是否被子类继承

/* *@Target:描述注解作用的位置 * ElementType的取值: * Type:可以作用于类上 * METHOD:可以作用于方法上 * FIELD:可以作用于成员变量上 *@Retention:描述注解被保留的阶段 * SOURCE CLASS RUNTIME * @Retention(RetentionPolicy.RUNTIME):当前描述的注解会被保留到class字节码文件中,并被jvm读取到 *@Documented:描述注解是否被抽取到api文档中 *@Inherited:描述注解是否会被子类继承 */ @Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface myAnno{ String show(); int age() default 12; } @myAnno(show = "afdd") public class worker{ }

使用注解替换配置文件 后期注解一般都干这种事

这里等作者学完反射之后再写

注解测试案例 我们来测试下面这个类有没有错误

public class Calculator { //加法 @Check public void add(){ System.out.println("1 + 0="+(1+0)); } //减法 @Check public void sub(){ System.out.println("1 - 0 = "+(1-0)); } //乘法 @Check public void mul(){ System.out.println("1 * 0 = "+(1*0)); } //除法 @Check public void div(){ System.out.println("1/0 = "+(1/0)); } public void show(){ System.out.println("永无bug..."); } }

我们首先定义Check这个注解

import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(value = ElementType.METHOD) public @interface Check { }

然后具体实现这个注解的功能

public class TestCheck { //当主方法执行后,会自动检测加了注解的所有方法,判断是否有异常,记录到文件中 public static void main(String[] args) throws IOException { //1.创建计算器对象 Calculator c = new Calculator(); //2.获取字节码文件对象 Class cls = c.getClass(); //3.获取所有方法 Method[] methods = cls.getMethods(); BufferedWriter bw = new BufferedWriter(new FileWriter("error.txt")); //4.判断方法上是不是有Check注解 for(Method method:methods) { if(method.isAnnotationPresent(Check.class)){ try {//5.有,执行 method.invoke(c); }//6.捕获异常 catch (Exception e) { //记录到文件中 bw.write(method.getName()+"方法出异常了"); bw.newLine(); bw.write("异常的名称:"+e.getCause().getClass().getSimpleName()); bw.newLine(); bw.write("异常的原因"+e.getCause().getMessage()); bw.newLine(); bw.write("----------------"); } } } bw.close(); } } 运行结果: div方法出异常了 异常的名称:ArithmeticException 异常的原因/ by zero ----------------

注解都给谁用? 1.编译器 2.解析程序(也就是上边我们写的TestCheck类) 注解不算程序的一部分

最新回复(0)