@interface与interface的区别以及@interface的用法_@interface和interface-程序员宅基地

技术标签: Java  java  

  • interface:声明一个Java接口

    • 接口可以理解成一种特殊的类,在这个类中只能有常量和抽象方法;接口不可以实例化,接口中的方法没有方法体,继承接口的类必须实现接口中定义的方法。
  • @interface:一个继承了java.lang.annotation.Annotation接口的自定义注解,定义注释类型。

    • Java从1.5开始提供annotation(注解、标注),它用来修饰应用程序的元素(类、方法、属性、参数、本地变量、包、元数据),编译器将其与元数据一同存储在class文件中,运行期间通过Java的反射机制来处理其修饰的元素。annotation仅仅用来修饰元素,并不能影响代码的执行。只有通过其配套的框架或工具才能对其进行访问和处理


    @interface可以实现三种功能:
    (1)声明类:Class
    (2)声明类别:Category
    (3)声明扩展:Extension

一般的应用程序开发人员可能从不需要定义一个注释类型,但定义我们自己的注释类型并不复杂。
注释类型的定义跟定义一个接口相似,我们需要在 interface这个关键字前面加上一个@符号,即@interface。
注释中的每一个方法定义了这个注释类型的一个元素,注释中方法的声明中一定不能包含参数,也不能抛出异常;方法的返回值被限制为简单类型、String、Class、emnus、注释,和这些类型的数组。方法可以有一个缺省值。

这里是一个注释类型定义的例 子:

/**  
  * Describes the Request-For-Enhancement(RFE) that led  
  * to the presence of the annotated API element.  
  */ 
  public @interface RequestForEnhancement {
      
   int id();  
   String synopsis();  
   String engineer() default "[unassigned]";  
   String date(); default "[unimplemented]";  
  } 

一旦定义好了一个注释类型,你就可以用来作注释声明。注释一中特殊的修饰符,在其他修饰符(比如public,static,或者final等) 使用地方都可以使用。
 按照惯例,注释应该放在其他修饰符的前面。注释的声明用@符号后面跟上这个注释类型的名字,再后面跟上括号,括号中列出这个注释中元 素/方法的key-value对。值必须是常量。
 这里是一个例子,使用上面定义的注释类型:

@RequestForEnhancement(  
   id = 2868724,  
   synopsis = "Enable time-travel",  
   engineer = "Mr. Peabody",  
   date = "4/1/3007" 
  )  
  public static void travelThroughTime(Date destination) {
     ... } 

没有元素/方法的注释被成为标记(marker)注释类型,例如

/**  
  * Indicates that the specification of the annotated API element  
  * is preliminary and subject to change.  
  */ 
  public @interface Preliminary {
     } 

标记注释在使用的时候,其后面的括号可以省略,例如

@Preliminary public class TimeTravel {
     ... } 

如果注释中仅包含一个元素,这个元素的名字应该为value,例如:

/**  
  * Associates a copyright notice with the annotated API element.  
  */ 
  public @interface Copyright {
     String value(); } 

如果元素的名字为value,使用这个注释的时候,元素的名字和等号可以省略,如:

@Copyright("2002 Yoyodyne Propulsion Systems")   
public class OscillationOverthruster {
     ... } 

为了将上面提到的东西结合在一起,我们创建了一个简单的基于注释的测试框架。首先我们需要一个标记注释类型用以说明一个方法是一个测试方法,并被测试工具执行。

import java.lang.annotation.*;  
  /**  
  * Indicates that the annotated method is a test method.  
  * This annotation should be used only on parameterless static methods.  
  */ 
  @Retention(RetentionPolicy.RUNTIME)  
   @Target(ElementType.METHOD)  
  public @interface Test {
     }  
  我们可以注意到这个注释类型本省也被注释了,这种注释叫做元注释。第一注释 (@Retention(RetentionPolicy.RUNTIME))表示这种类型的注释被VM保留从而使其能够通过反射在运行时读取;第二个注 释@Target(ElementType.METHOD)表示这种注释只能用来注释方法。
下面是一个简单的类,其中的几个方法被加了上面的注释:

  public class Foo {
      
   @Test public static void m1() {
     }  
   public static void m2() {
     }  
   @Test public static void m3() {
      
   throw new RuntimeException("Boom");  
   }  
   public static void m4() {
     }  
   @Test public static void m5() {
     }  
   public static void m6() {
     }  
   @Test public static void m7() {
      
   throw new RuntimeException("Crash");  
   }  
   public static void m8() {
     }  
  } 

这里是测试工具:

import java.lang.reflect.*;
  public class RunTests {
   public static void main(String[] args) throws Exception {
   int passed = 0, failed = 0;
   for (Method m : Class.forName(args[0]).getMethods()) {
   if (m.isAnnotationPresent(Test.class)) {
   try {
   m.invoke(null);
   passed++;
   } catch (Throwable ex) {
   System.out.printf(“Test %s failed: %s %n”, m, ex.getCause());
   failed++;
   }
   }
   }
   System.out.printf(“Passed: %d, Failed %d%n”, passed, failed);
   }
  }

这个工具用一个类名作为参数,遍历这个类中的所有方法,并调用其中被加了@Test注释的方法。如果一个方法抛出了一个异常,那么这个测试就失败了,最终的测试结果被打印了出来。下面是程序运行的结果:

 $ java RunTests Foo     Test public static void Foo.m3() failed:
 java.lang.RuntimeException: Boom      Test public static void Foo.m7()
 failed: java.lang.RuntimeException: Crash      Passed: 2, Failed 2


还可参考:https://blog.csdn.net/zhangbeizhen18/article/details/87885441

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CSL201816080304/article/details/106241198

智能推荐

python 完整的海龟策略_海龟策略btc现货版-程序员宅基地

文章浏览阅读473次。海龟策略btc现货版海龟策略btc现货版Author: groot, Date: 2020-02-22 21:40:07Tags:看到平台上没有公开的python海龟策略,自己写个简单的抛个砖。接近原版的海龟系统,没怎么优化,当做回测试验吧,也可以自己再优化下接实盘跑。开仓:超过唐奇安上轨开仓加仓:超过之前的价格的0.5ATR就加仓止损止盈:跌破下轨或者跌破上次开仓价-2ATR就全部止盈回测了1年..._btc 海龟交易策略

DC2DC, 开关电源L,C 计算_开关电源输出电容计算-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏38次。#1, L calculation, about L,C calcuation theoryhttp://www.360doc.com/content/12/1016/18/10906019_241859825.shtml某型号的DC-DC集成电路输入电压范围是4.7-16V,现在有个电路用它来把12V转为3.3V,最大输出电流是2A。如果开关频率是500KHZ,那么电感的推荐值是多大?解:(1)buck电路在VIN=12V时设计电感(2)占空比:D=VO/ VIN=3.3/12_开关电源输出电容计算

html embed自动播放,HTML-embed标签-程序员宅基地

文章浏览阅读2.6k次。标签 标签不符合标准网页设计的理念,不赞成使用。 标签已经被符合标准的 标签代替。定义及用法定义嵌入的内容,比如插件。embed可以用来插入各种多媒体,格式可以是 Midi、Wav、AIFF、AU、MP3等等,所有主流浏览器都支持 标签。属性设置src 内容的URLurl为音频或视频文件及其路径,可以是相对路径或绝对路径。name 对象名称该属性给对象取名,以便其他对象利用。type 内容的..._html embed autoopen

jquery给追加的类名添加点击事件,类名绑定点击事件不生效_点击加上的类名后再根据加上的类名进行点击事件-程序员宅基地

文章浏览阅读3.8k次。元素追加类后添加点击给追加后的类添加点击事件// An highlighted block html 部分 <td> <i>¥ </i> <i class="on_price">{$vo.price}</i> <input type="text" n..._点击加上的类名后再根据加上的类名进行点击事件

Android Studio如何设置占用的最大内存?_android studio设置内存大小-程序员宅基地

文章浏览阅读5.7k次。1.File-Settings,如下图,是应用到所有项目中的。2.下方的“Daemon Heap Size Setting”是设置当前项目编译时所能使用的最大内存的,所以如果我们需要仅当前项目有效,可以在这里设置,设置好之后点击“确定”,完成更改。..._android studio设置内存大小

python刷题+leetcode(第一部分)-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏6次。一,题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。class Solution: def find(self,number,matrix): rows=len(matrix)#行数 cols=len(matrix[0]...

随便推点

python输出数学公式_使用Markdown输出LaTex数学公式-程序员宅基地

文章浏览阅读423次。现在大数据、人工智能、数据分析等很多技术岗位都对数学有一定的要求,数学越来越重要,很多人也开始尝试学习数学,脑子里突然就有了结合Python编程来学习数学的想法。在网络上搜索了很多相关资料,看到非常多不错的尝试,但是国内在这方面的资料却比较少,于是就想到开一个技术专栏。实践出一整套便于互联网传播分享的数学公式跨平台编辑、跨环境显示是非常有必要的,如果还是停留在Word或PDF时代,那数学就会被限制..._python 数学公式markdown打印

Ubuntu14.04下使用conky美化桌面_audacious 美化-程序员宅基地

文章浏览阅读3.8k次。Ubuntu14.04下使用conky美化桌面_audacious 美化

vue3使用this.$router.push跳转后页面生命周期内的请求数据不重载问题_vue push再返回会重新挂载吗-程序员宅基地

文章浏览阅读1.5k次。vue3使用this.$router.push跳转后页面生命周期内的请求数据不重载问题场景:原因:解决办法:_vue push再返回会重新挂载吗

实战:RBAC(基于角色的权限控制)-2021.11.28_nodejs rbac-程序员宅基地

文章浏览阅读1k次。目录文章目录目录实验环境实验软件(无)1、RBAC(基于角色的权限控制)2、API 对象3、RBAC:cupid:1.演示:只能访问某个 namespace 的普通用户(1)创建用户凭证(2)创建角色(3)创建角色权限绑定(4)测试:cupid:2.演示:只能访问某个 namespace 的 ServiceAccount:cupid:3.演示:可以全局访问的 ServiceAccount4、注意事项1.`noResources概念`2.这个`cluster-admin`clusterrole的权限是无敌._nodejs rbac

弹性计算中的云计算中的物联网和边缘计算_物联网应用的弹性是什么-程序员宅基地

文章浏览阅读4.1k次。作者:禅与计算机程序设计艺术 “弹性计算”作为云计算领域的一个分支,其主要目的是解决云计算资源的弹性扩展、高可用、可伸缩性等方面的问题。其核心技术包括虚拟机(VM)、容器(Container)、自动化、弹性调度等。在最近几年,随着物联网和边缘计算的兴起,弹性计算也逐渐进入到云计算中来。本文将从云计算和物联网/边缘计算两个角度详细介绍弹性计_物联网应用的弹性是什么

Harmony OS STM32 移植——编译官方代码-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏40次。期待很久的鸿蒙系统最近刚刚发布,移植到ARM平台上玩一下。记录一下踩到的坑。鸿蒙系统在github 上的地址 https://liteos.github.io/porting/使用的开发工具:keil5 MDK第一步先下载样例工程使用keil5打开工程后按F7进行编译出现如下的问题../Drivers/STM32F1xx_HAL_Driver/Src/s..._harmony os

推荐文章

热门文章

相关标签