Java注释@interface的用法

转载自 Java注释@interface的用法

java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类


@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事

 

注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错,如图:


       注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时,在属性和方法
上用@Deprecated修饰,如图:

  注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候,
 如图:

  

注解@Retention可以用来修饰注解,是注解的注解,称为元注解


Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS  RUNTIME   SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.

package com.self;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  @Retention(RetentionPolicy.RUNTIME)  
public @interface MyTarget  
{ } 

定义个一注解@MyTarget,用RetentionPolicy.RUNTIME修饰;

package com.self;  
import java.lang.reflect.Method;  
public class MyTargetTest  
{  @MyTarget  public void doSomething()  {  System.out.println("hello world");  }  public static void main(String[] args) throws Exception  {  Method method = MyTargetTest.class.getMethod("doSomething",null);  if(method.isAnnotationPresent(MyTarget.class))//如果doSomething方法上存在注解@MyTarget,则为true  
  {  System.out.println(method.getAnnotation(MyTarget.class));  }  }  
}  

上面程序打印:@com.self.MyTarget(),如果RetentionPolicy值不为RUNTIME,则不打印

@Retention(RetentionPolicy.SOURCE )  
public @interface Override  @Retention(RetentionPolicy.SOURCE )  
public @interface SuppressWarnings  @Retention(RetentionPolicy.RUNTIME )  
public @interface Deprecated  

由上可以看出,只有注解@Deprecated在运行时可以被JVM读取到  

注解中可以定义属性,看例子:

@Retention(RetentionPolicy.RUNTIME)  
public @interface MyAnnotation  
{  String hello() default "gege";  String world();  int[] array() default { 2, 4, 5, 6 };  EnumTest.TrafficLamp lamp() ;  TestAnnotation lannotation() default @TestAnnotation(value = "ddd");  Class style() default String.class;  
}  

上面程序中,定义一个注解@MyAnnotation,定义了6个属性,他们的名字为:  

hello,world,array,lamp,lannotation,style.  

  • 属性hello类型为String,默认值为gege  
  • 属性world类型为String,没有默认值  
  • 属性array类型为数组,默认值为2,4,5,6  
  • 属性lamp类型为一个枚举,没有默认值  
  • 属性lannotation类型为注解,默认值为@TestAnnotation,注解里的属性是注解  
  • 属性style类型为Class,默认值为String类型的Class类型  

看下面例子:定义了一个MyTest类,用注解@MyAnnotation修饰,注解@MyAnnotation定义的属性都赋了值

@MyAnnotation(hello = "beijing", world="shanghai",array={},lamp=TrafficLamp.RED,style=int.class)  
public class MyTest  
{  @MyAnnotation(lannotation=@TestAnnotation(value="baby"), world = "shanghai",array={1,2,3},lamp=TrafficLamp.YELLOW)  @Deprecated  @SuppressWarnings("")  public void output()  {  System.out.println("output something!");  }  
}  

接着通过反射读取注解的信息:  

public class MyReflection  
{  public static void main(String[] args) throws Exception  {  MyTest myTest = new MyTest();  Class<MyTest> c = MyTest.class;  Method method = c.getMethod("output", new Class[] {});  //如果MyTest类名上有注解@MyAnnotation修饰,则为true  if(MyTest.class.isAnnotationPresent(MyAnnotation.class))  {  System.out.println("have annotation");  }  if (method.isAnnotationPresent(MyAnnotation.class))  {  method.invoke(myTest, null); //调用output方法  //获取方法上注解@MyAnnotation的信息  MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);  String hello = myAnnotation.hello();  String world = myAnnotation.world();  System.out.println(hello + ", " + world);//打印属性hello和world的值  System.out.println(myAnnotation.array().length);//打印属性array数组的长度  System.out.println(myAnnotation.lannotation().value()); //打印属性lannotation的值  
   System.out.println(myAnnotation.style());  }  //得到output方法上的所有注解,当然是被RetentionPolicy.RUNTIME修饰的  Annotation[] annotations = method.getAnnotations();  for (Annotation annotation : annotations)  {  System.out.println(annotation.annotationType().getName());  }  }  
}  

上面程序打印:  

have annotation  
output something!  
gege, shanghai  
3  
baby  
class java.lang.String  
com.heima.annotation.MyAnnotation  
java.lang.Deprecated 

如果注解中有一个属性名字叫value,则在应用时可以省略属性名字不写。  

可见,@Retention(RetentionPolicy.RUNTIME )注解中,RetentionPolicy.RUNTIME是注解属性值,属性名字是value,  

属性的返回类型是RetentionPolicy,如下:

public @interface MyTarget  
{  String value();  
}  

可以这样用:  

@MyTarget("aaa")  public void doSomething()  {  System.out.println("hello world");  }  

注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型,  

值为:ANNOTATION_TYPE CONSTRUCTOR  FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE  

@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上

@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface MyTarget  
{  String value() default "hahaha";  
}  

如把@MyTarget修饰在类上,则程序报错,如:

@MyTarget  
public class MyTargetTest 

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPC的发展历史

服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出。 这样能实现通讯&#xff0c;但有个问题。如何知道更多信息&#xff1f;比如需要发送流大小&#xff0c;编码&#xff0c;Ip等。 这样就有了协议&#xff0c;协议就是规范…

类的继承python 简明_[简明python教程]学习笔记2014-05-04

今天学习的内容&#xff1a;1.面向对象编程的概念1)面向对象的三个基本特征&#xff1a;封装、继承、多态2)类和对象是面向对象编程的2个主要方面。类使用class关键字创建。类的域和方法被列在一个缩进块中。2.类[rootreed 0504]# cat simpleclass.py#!/usr/bin/pythonclass Pe…

子类可以继承到父类上的注解吗

转载自 子类可以继承到父类上的注解吗?不了解注解基础知识的请先看《JDK 5 Annotation\注解\注释\自定义注解》子类可以继承到父类上的注解吗&#xff1f; 我们知道在编写自定义注解时&#xff0c;可以通过指定Inherited注解&#xff0c;指明自定义注解是否可以被继承。但实现…

java aop 实例_Spring aop 简单示例

简单的记录一下spring aop的一个示例基于两种配置方式&#xff1a;基于xml配置基于注解配置这个例子是模拟对数据库的更改操作添加事物其实并没有添加&#xff0c;只是简单的输出了一下记录首先看下整个例子的目录图全部代码就不贴了&#xff0c;数目有点多&#xff0c;不过很简…

用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

原文&#xff1a;Building Your First Web API with ASP.NET Core MVC and Visual Studio作者&#xff1a;Mike Wasson 和 Rick Anderson翻译&#xff1a;谢炀(kiler)校对&#xff1a;何镇汐、刘怡(AlexLEWIS) HTTP 协议不仅仅提供网页服务。它也是一个构建公开服务和数据 API …

java抽取pdf_java 抽取 word,pdf 的四种武器

转自:https://www.ibm.com/developerworks/cn/java/l-java-tips/ 感谢作者发布的文章用 jacob其实 jacob 是一个 bridage&#xff0c;连接 java 和 com 或者 win32 函数的一个中间件&#xff0c;jacob 并不能直接抽取 word,excel 等文件&#xff0c;需要自己写 dll 哦&…

SuperSocket与Netty之实现protobuf协议,包括服务端和客户端

今天准备给大家介绍一个c#服务器框架&#xff08;SuperSocket&#xff09;和一个c#客户端框架&#xff08;SuperSocket.ClientEngine&#xff09;。这两个框架的作者是园区里面的江大渔。 首先感谢他的无私开源贡献。之所以要写这个文章是因为群里经常有人问这个客户端框架要如…

Java 注解指导手册 – 终极向导

转载自 Java 注解指导手册 – 终极向导译文出处&#xff1a; Toien Liu 原文出处&#xff1a;Dani Buiza编者的话&#xff1a;注解是java的一个主要特性且每个java开发者都应该知道如何使用它。我们已经在Java Code Geeks提供了丰富的教程, 如Creating Your Own Java Annota…

ajax调用后台java类_ajax调用java后台方法是什么

ajax是一种基于 JavaScript和HTTP请求(HTTP requests)&#xff0c;广泛应用在浏览器的网页开发技术。那么&#xff0c;ajax调用java后台方法是什么?var http_requestfalse;function sendRequest(method,url,content,processResponse){http_requestfalse;if(window.XMLHttpRequ…

用 Visual Studio 发布一个 Azure 云 Web 应用程序

原文&#xff1a;Getting Started 作者&#xff1a;Rick Anderson 翻译&#xff1a;谢炀(Kiler) 校对&#xff1a;孟帅洋(书缘)、刘怡(AlexLEWIS)、何镇汐 设置开发环境 安装最新版本的 Azure SDK for Visual Studio 2015。如果你之前没有装过 Visual Studio 2015&#xff0c;S…

Java中的注解是如何工作的

转载自 Java中的注解是如何工作的&#xff1f;自Java5.0版本引入注解之后&#xff0c;它就成为了Java平台中非常重要的一部分。开发过程中&#xff0c;我们也时常在应用代码中会看到诸如Override&#xff0c;Deprecated这样的注解。这篇文章中&#xff0c;我将向大家讲述到底什…

impdp导入mysql_Oracle数据库的impdp导入操作以及dba_directories使用方法

Oracle数据库的impdp导入操作以及dba_directories使用方法今天从同事那里拿到了导出的dmp文件&#xff0c;当导入时发现了很多问题&#xff0c;记下来以免以后忘记&#xff0c;以下是本人的操作过程&#xff1a;1.首先是创建一个文件夹dump&#xff0c;用来存放dmp文件&#xf…

ASP.NET Core MVC 与 Visual Studio 入门

原文&#xff1a;Getting started with ASP.NET Core MVC and Visual Studio作者&#xff1a;Rick Anderson翻译&#xff1a;娄宇(Lyrics)校对&#xff1a;刘怡(AlexLEWIS)、夏申斌 、张硕(Apple) 这篇教程将告诉你如何使用 Visual Studio 2015 构建一个 ASP.NET Core MVC Web …

深入理解Java:注解(Annotation)自定义注解入门

转载自 深入理解Java&#xff1a;注解&#xff08;Annotation&#xff09;自定义注解入门要深入学习注解&#xff0c;我们就必须能定义自己的注解&#xff0c;并使用注解&#xff0c;在定义自己的注解之前&#xff0c;我们就必须要了解Java为我们提供的元注解和相关定义注解的语…

java快排原理_Java数据结构与算法——快速排序

声明&#xff1a;码字不易&#xff0c;转载请注明出处&#xff0c;欢迎文章下方讨论交流。前言&#xff1a;Java数据结构与算法专题会不定时更新&#xff0c;欢迎各位读者监督。本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法——快排&#xff0c;包括快排的思想…

厚积薄发,拥抱 .NET 2016

厚积薄发这个词是高三英语老师在高考前写在黑板上&#xff0c;高中三年努力这么久&#xff0c;是时候迎面而上&#xff0c;冲刺向前。所以&#xff0c;一想到.NET 2016&#xff0c;脑海里蹦出的第一个词就是它。 .NET 2016 是 .NET 一次质的飞跃&#xff0c;不管难易&#xff0…

CGLIB 实现代理对象API

转载自 CGLIB 实现代理对象API1. 加入库cglib库cglib-2.2.jarasm库(cglib 需要asm库,如果没有加入asm的jar文件,就会报asm错误)asm-3.1.jar 2. 定义CGLIB操作类package com.machome.cglibtest;import java.lang.reflect.Method;import com.machome.model.StuService;import net…

android java split_Java中的split函数的用法

Java中的 split 函数是用于按指定字符(串)或正则去分割某个字符串&#xff0c;结果以字符串数组形式返回&#xff1b;例如:String str"1234abc";String[] a str.split("");System.out.println("处理结果: "a[0]","a[1]); //输出的…

第二章指南(4.2)添加 Controller

原文&#xff1a;Adding a controller翻译&#xff1a;娄宇(Lyrics)校对&#xff1a;刘怡(AlexLEWIS)、何镇汐、夏申斌、孟帅洋(书缘) Model-View-Controller (MVC) 架构模式将一个应用程序分离成三个主要的组件&#xff1a; Model、View 以及Controller 。 MVC 模式帮助你创建…

jdk和cglib简单理解

转载自 jdk和cglib简单理解之前使用cglib的时候不需要将classLoader作为参数传入&#xff0c;但动态代理却要&#xff0c;带着这个疑惑进入这个方法&#xff1a;Proxy.newProxyInstance(classLoader, interfaces, InvocationHandler)要在classLoader里去找interfaces&#xff0…