栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 注解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 概念
  • 定义
  • 概念描述
  • 作用分类
  • JDK中预定义的一些注解
  • 自定义注解
  • 在程序使用(解析)注解
  • 实例
  • 小结


概念

说明程序的。 给计算机看

定义

注解(Annotation)也叫元数据,一种代码级别的说明。JDK1.5之后引入的特性,与类、接口、枚举在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。


概念描述

JDK1.5之后的新特性
说明程序的
使用注释: @注解名称


作用分类

1.编写文档: 通过代码里标识的元数据生成文档 【生成文档doc文档】
—javadoc命令 使.java生成文档
2.代码分析: 通过代码里标识的元数据对代码进行分析 【使用反射】
3.编译检查: 通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】


JDK中预定义的一些注解

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

@Override  // 检测被注解标注的方法是否是继承自父类(接口)
@Deprecated // 被该注解注释的内容 表示已过时
@SuppressWarnings  // 压制警告

自定义注解

格式:
-----元注解
public @interface 注解名称{
属性列表
}

// 本质上是一个接口 默认继承了Annotation接口
// 属性: 接口中可以定义的成员方法 就是接口中的抽象方法


public interface MyAnno extends java.lang.annotation.Annotation{}
// 等于
public @interface MyAnno{
   
  // public abstract String show();  // 接口中方法默认就是 public abstract
  int age();

  String name() default "张三"; // 默认值

  @interface anno2;

}

public @interface MyAnno2{

}


@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) // 表示MyAnno3注解智能作用于类上  方法上  属性上
@Retention(RetentionPolicy.RUNTIME)
@Oocumented
@Inherited  是否能被描述的类的子类继承
public @interface MyAnno3{

}

@MyAnno(age = 12, name = "张三", anno2 = @MyAnno2)
@MyAnno3
public class Worker{
   @MyAnno3
   public String name = "aaa";

   @MyAnno3
   public void show(){
   }
}

// 通过@Inherited 可以让teacher类使用 @MyAnno3
public class Teacher extends Worker{

}

在程序使用(解析)注解

获取注解的值

@Target({ElementType.TYPE})   // 使用在类上
@Retention(RetentionPolicy.RUNTIME)  // 实在在运行阶段
public @interface Pro {

  String className();
  String methodName();
}



public class Demo1{
  public void show(){
     System.out.println("demo1...show")
  }
}

public class Demo2{
  public void show(){
     System.out.println("demo2...show")
  }
}


@Pro(className = "cn.itcast.annotation.Demo1", methodName= "show")
public class ReflectTest{
  public static void main(String[] arg) throws Exception {
  
    // 解析注解
    // 1. 获取该类的字节码文件对象
    Class reflectTestClass = ReflectTest.class;
    // 2. 获取上边的注解对象
    Pro an = reflectTestClass.getAnnotation(Pro.class);
    // 3. 调用注解对象中定义的抽象方法 获取返回值
    String className = an.className();


   // 反射写法
   // 1. 加载类到内存
   Class cls = Class.forName(className);
   // 2. 创建对象
   Object obj = cls.newInstance();
   // 3. 获取方法对象
   Method method = cls.getMethod(methodName);
   // 执行方法
   method.invoke(obj);
  }

}

实例
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(){

   }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Check{
    
}

public static void main(String[] args){
   // 1. 创建计算器对象
   Calulator c = new Calculator();
   // 2. 获取字节码文件对象
   Class cls = c.getClass();
   // 3. 获取所有方法
   Method[] methods = cls.getMethods();

   int number = 0;  // 出现异常的次数
   BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));

   for(Method method : methods){
     // 4. 判断方法上是否有Check注解
     if(method.isAnnotationPresent(Check.class)){
         // 5. 有, 执行
         try {
          method.invoke(c);
       } catch (Exception e){
           // 6. 捕获异常
           number ++;
           bw.writer( method.getName() + "xxx方法异常了");
           bw.newLine();
           bw.writer( "异常的名称:" + e.getCause().getClass().getSimpleName());
           bw.newLine();
           bw.writer( "异常的原因:" + e.getCause().getMessage());
           bw.newLine();
           bw.writer( "-----------------------");
       }
     }
     bw.write("本次出现"+ num + " 次异常");
     bw.flush();
     bw.close();
  }
}

小结

1.以后大多数时间 使用注解 而不是自定义注解
2.注解给谁用?
1. 编译器
2. 给解析程序用
3. 注解就是一个标签

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/964067.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号