📜  Java4/5 注释

📅  最后修改于: 2020-10-13 06:54:36             🧑  作者: Mango

Java注解

Java Annotation是表示元数据的标记,即附加有类,接口,方法或字段的元数据,以指示Java编译器和JVM可以使用的一些附加信息。

Java中的注释用于提供其他信息,因此它是XML和Java标记接口的替代选项。

首先,我们将学习一些内置注释,然后继续创建和使用自定义注释。

内置Java注释

Java中有几个内置注释。一些注释应用于Java代码,而另一些注释则应用于其他注释。

Java代码中使用的内置Java注释

  • @Override
  • @SuppressWarnings
  • @已弃用

其他注释中使用的内置Java注释

  • @目标
  • @保留
  • @遗传
  • @记录

了解内置注释

首先让我们了解内置注释。

@Override

@Override注释可确保子类方法将覆盖父类方法。如果不是这样,则会发生编译时错误。

有时,我们会犯一些愚蠢的错误,例如拼写错误等。因此,最好标记@Override注释,以确保方法被覆盖。

class Animal{
void eatSomething(){System.out.println("eating something");}
}

class Dog extends Animal{
@Override
void eatsomething(){System.out.println("eating foods");}//should be eatSomething
}

class TestAnnotation1{
public static void main(String args[]){
Animal a=new Dog();
a.eatSomething();
}}
Output:Comple Time Error

@SuppressWarnings

@SuppressWarnings批注:用于禁止编译器发出的警告。

import java.util.*;
class TestAnnotation2{
@SuppressWarnings("unchecked")
public static void main(String args[]){
ArrayList list=new ArrayList();
list.add("sonoo");
list.add("vimal");
list.add("ratan");

for(Object obj:list)
System.out.println(obj);

}}

Now no warning at compile time.

如果删除@SuppressWarnings(“ unchecked”)批注,由于我们使用的是非通用集合,它将在编译时显示警告。

@已弃用

@Deprecated注释表示此方法已弃用,因此编译器将显示警告。它通知用户它可能会在将来的版本中删除。因此,最好不要使用这种方法。

class A{
void m(){System.out.println("hello m");}

@Deprecated
void n(){System.out.println("hello n");}
}

class TestAnnotation3{
public static void main(String args[]){

A a=new A();
a.n();
}}

在编译时:

Note: Test.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

在运行时:

hello n

Java自定义注释

Java自定义注释或Java用户定义的注释易于创建和使用。 @interface元素用于声明注释。例如:

@interface MyAnnotation{}

在这里,MyAnnotation是自定义注释名称。

Java自定义注释Signature(签名)要记住的要点

程序员应该记住一些要点。

  • 方法不应包含任何throws子句
  • 方法应返回以下之一:原始数据类型,字符串,类,枚举或这些数据类型的数组。
  • 方法不应具有任何参数。
  • 我们应该在接口关键字之前附加@来定义注释。
  • 它可以为该方法分配默认值。

注释类型

有三种类型的注释。

  • 标记注释
  • 单值注释
  • 多值注释

1)标记注释

没有方法的注释称为标记注释。例如:

@interface MyAnnotation{}

@Override和@Deprecated是标记注释。

2)单值注释

具有一种方法的注释称为单值注释。例如:

@interface MyAnnotation{
int value();
}

我们也可以提供默认值。例如:

@interface MyAnnotation{
int value() default 0;
}

如何应用单值注释

让我们看一下应用单值注释的代码。

@MyAnnotation(value=10)

该值可以是任何值。

3)多值注释

具有多种方法的注释称为多值注释。例如:

@interface MyAnnotation{
int value1();
String value2();
String value3();
}
}

我们也可以提供默认值。例如:

@interface MyAnnotation{
int value1() default 1;
String value2() default "";
String value3() default "xyz";
}

如何应用多值注释

让我们看一下应用多值注释的代码。

@MyAnnotation(value1=10,value2="Arun Kumar",value3="Ghaziabad")

Java自定义注释中使用的内置注释

  • @目标
  • @保留
  • @遗传
  • @记录

@目标

@Target标记用于指定使用哪种类型的注释。

java.lang.annotation.ElementType枚举声明了许多常量以指定要在其中应用注释的元素的类型,例如TYPE,METHOD,FIELD等。让我们来看一下ElementType枚举的常量:

Element Types Where the annotation can be applied
TYPE class, interface or enumeration
FIELD fields
METHOD methods
CONSTRUCTOR constructors
LOCAL_VARIABLE local variables
ANNOTATION_TYPE annotation type
PARAMETER parameter

为类指定注释的示例

@Target(ElementType.TYPE)
@interface MyAnnotation{
int value1();
String value2();
}

为类,方法或字段指定注释的示例

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@interface MyAnnotation{
int value1();
String value2();
}

@保留

@Retention批注用于指定注释级别。

RetentionPolicy Availability
RetentionPolicy.SOURCE refers to the source code, discarded during compilation. It will not be available in the compiled class.
RetentionPolicy.CLASS refers to the .class file, available to java compiler but not to JVM
. It is included in the class file.
RetentionPolicy.RUNTIME refers to the runtime, available to java compiler and JVM
.

指定RetentionPolicy的示例

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation{
int value1();
String value2();
}

自定义注释的示例:创建,应用和访问注释

让我们看一下创建,应用和访问注释的简单示例。

文件:Test.java

//Creating annotation
import java.lang.annotation.*;
import java.lang.reflect.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation{
int value();
}

//Applying annotation
class Hello{
@MyAnnotation(value=10)
public void sayHello(){System.out.println("hello annotation");}
}

//Accessing annotation
class TestCustomAnnotation1{
public static void main(String args[])throws Exception{

Hello h=new Hello();
Method m=h.getClass().getMethod("sayHello");

MyAnnotation manno=m.getAnnotation(MyAnnotation.class);
System.out.println("value is: "+manno.value());
}}
Output:value is: 10

在实际场景中如何使用内置注释?

在实际情况下,Java程序员只需要应用注释。他/她不需要创建和访问注释。创建和访问注释由实现提供者执行。代表注释,java编译器或JVM执行一些其他操作。

@遗传

默认情况下,注释不继承到子类。 @Inherited批注将批注标记为要继承到子类。

@Inherited
@interface ForEveryone { }//Now it will be available to subclass also

@interface ForEveryone { }
class Superclass{}

class Subclass extends Superclass{}

@记录

@Documented标记要包含在文档中的注释。