登陆

极彩娱乐登录-Java中的注解运用:全面性的总结一下

admin 2019-10-29 218人围观 ,发现0个评论

前话:

今日,咱们又来聊一下注解的运用,做一下具体的解析,也介绍了自界说注解,请耐性往下看哟!

注解的介绍:

在2005年,sun公司推出了jdk1.5,一同推出的注解功用招引了很多人的目光,运用注解编写代码,能够减轻java程序员繁琐装备的苦楚。

运用注解能够编写出愈加易于保护,bug更少的代码。

注解是什么呢?依照官方的说法,注解便是元标签,能够增加到你的代码,并运用于包声明、类型声明、结构函数、办法、字段、参数和变量。

注解供给了一种十分有用的办法来显现你编写的办法是否依赖于其他办法,它们是否完好,编写出的类是否引用了其他类,等等。

依照 Oracle官方 的说法,依据注解编写出的java代码会依据源代码中的注解生成模板代码,然后防止咱们在大多数情况下编写模板代码。这导致了一种声明式编程风格,在这种风格中,程序员说要做什么功用,东西就写出相应的代码来完成它。

简而言之,注解是一种机制,用于将元标签与程序元素相关联,并答应编译器或虚拟机从这些注解元素中提取程序行为,并在必要时生成相互依赖的代码。

那么,现在就开端咱们的java注解学习之旅。

内置注解

ava会内置一些现已完成好的注解,能够直接运用,内置的注解首要用于给java编译器供给指令。

Java内置的注解有五个:

  • @Deprecated
  • @Override
  • @SuppressWarnings
  • @SafeVarargs
  • @FunctionalInterface

1. @Deprecated 注解首要用于给类、办法、变量打上不主张运用的标签,假如你的代码运用了不主张运用的类、办法、变量,编译器就会给你一个正告。

下面是运用@Deprecated的示例:

public class AnnotationTest {
public static void main(String args[]){
MyAnnotation myAnnotation = new MyAnnotation();
int age = myAnnotation.age;
myAnnotation.eat();
}
}
@Deprecated
class MyAnnotation {
@Deprecated
int age;

@Deprecated
void eat(){

}
}

界说了一个MyAnnotation,在类名,变量名和办法名上都运用的@Deprecated注解。

运用了@Deprecated标识的类、办法或变量时,

@Deprecated还有别的一个用途,便是在javadoc文档中写明类、办法或变量为什么不主张运用,而且给出代替办法:

@Deprecated
/**
@deprecated 已抛弃,请运用MyNewComponent.
*/
class MyComponent {
}

2.@Override注解在办法上运用,标识这个办法重写父类的办法。假如这个办法和父类办法不一致,编译器就会显现过错。

强烈主张在重写父类的办法上运用@Override注解,不必也不会有什么影响,可是假如不运用@Override注解,当有人修正父类的办法时,你就无法识别出子类的办法是否重写了父类的办法。而运用了@Override注解,只需父类没有这个办法,编译器就会提示父类没有对应办法的过错。

下面是运用@Override注解的示例:

class Anaimal{
public void run(){

}
}
class Cat extends Anaimal{
@Override
public void run(){

}
}

Cat类的run()办法运用了@Override注解,假如将Cat类中的办法改为run1(),编译器就会显现The method run1() of type Cat must override or implement a supertype 的过错。

假如不运用@Override注解,将Cat类中的办法改为run1(),体系则不会报错。

3.@SuppressWarnings注解也是在办法上运用,用于按捺正告,在调用deprecated的办法或许进行不安全的类型转化时,编译器会宣布一些正告,运用@SuppressWarnings就能够疏忽那些正告。

运用示例:

@SuppressWarnings
public void methodWithWarning() {
}

4.@SafeVarargs注解首要用于按捺参数类型安全查看正告,这个是jdk1.7新增的功用。

运用示例:

@SafeVarargs
static void testSafeVarargs(List ... stringLists) {
Object[] array = stringLists;
List tmpList = Arrays.asList(42);
array[0] = tmpList;
String s = stringLists[0].get(0);
}

假如不运用@SafeVarargs注解,编译器会给出正告信息:Type safety: Potential heap pollution via varargs parameter stringLists 。

运用@SafeVarargs有个条件,你有必要确保某个运用了可变长度参数的办法,在与泛型类一同运用时不会呈现类型安全问题。不然在运转行时会抛出 ClassCastException反常。

@SafeVarargs注解只能在满意如下条件的办法上运用:

  • 参数长度可变的办法或结构办法。
  • 办法有必要声明为static或final。

5.@FunctionalInterface注解首要用于编译级过错查看,加上该注解,当你写的接口不符合函数式接口界说的时分,编译器会报错。

运用示例:

@FunctionalInterface
interface GreetingService
{
void readMessage(String message);
}

创立注解

注解的创立和接口有点相似,都是运用interface闯码头关检字,区别是创立注解时,需要在interface前面加上一个@字符。

下面是创立一个注解的比如:

public @interface MyAnnotation {
}

上面创立注解没有任何成员变量。

创立带成员变量的注解:

@interface TestAnnotation{
int age();
String name();
}

TestAnnotation注解有两个成员变量,age和name。

注解的成员变量以无参数无办法体的办法方式声明。

运用default关键字指定注解成员变量的默认值:

@interface TestAnnotation{
int age() default 2;
String name() default “小明”;
}

运用自界说注解时,假如该注解的变量有默认值,能够不为成员变量指定值,直接运用默认极彩娱乐登录-Java中的注解运用:全面性的总结一下值。

运用示例:

@interf极彩娱乐登录-Java中的注解运用:全面性的总结一下ace TestAnnotation{
int age() default 2;
String name() default "小明";
}
class MyAnnotation {
@TestAnnotation
public void getInfo(){

}
}

假如注解的变量没有默认值,在运用时有必要为每个变量都指定值,代码如下:

@interface TestAnnotation{
int age();
String name();
}
class MyAnnotation {
@TestAnnotation(age=2,name="小明")
public void getInfo(){

}
}

元注解

什么是元注解呢?元注解便是注解的注解,也便是用于界说注解的注解,能够理解为注解的根底数据类型。这玩意真的很拗口,仍是看代码比较舒畅。

@Target(ElementType.METHOD)
@interface Test_Target {
public String doTestTarget();
}

@Target便是元注解,用于界说Test_Target注解。

java供给五种元注解,分别是:

  • @Retention 指定注解的生命周期,即存活时刻。
  • @Documented javadoc指令生成的文档中表现注解的内容
  • @Target 指定注解可用于哪些元素,例如类、办法、变量等
  • @Inherited 注解的承继性,
  • @Repeatable 可重复运用的注解

@Retention用于指定注解的生命周期,即存活时刻。@Retention供给了如下的三个值,在运用@Retention时,有必要运用其间的一个值。

  • RetentionPolicy.SOURCE 注解只在源码阶段保存,在编译器进行编译生成class文件时丢掉,无法经过反射获取注解信息。
  • RetentionPolicy.CLASS 注解只被保存到编译进行的时分,它并不会被加载到JVM中,无法经过反射获取注解信息,这是默认值。
  • RetentionPolicy.RUNTIME 注解能够保存到程序运转的时分,它会被加载进入到 JVM 中,程序运转时能够经过反射获取到它们。

下面是运用@Retention界说一个自界说注解的示例:

@Retention(RetentionPolicy.RUNTIME)
@interface Test_Retention{

}
@Test_Retention
class MyAnnotation {
public void getInfo(){

}
}

上面的代码创立了一个Test_Retention的注解,而且运用@Retention指定Test_Retention注解能够保存到程序运转的时分(RetentionPolicy.RUNTIME),MyAnnotation运用@Test_Retention润饰,因此在运转极彩娱乐登录-Java中的注解运用:全面性的总结一下时能够经过反射获取到MyAnnotation的注解信息。

@Documented假如类A运用了@Documented元注解注解的注解,那么在运用javadoc生成的类A的文档会包括有相应的注解信息。

运用示例:

@Documented
@interface TestDocument{
String doTestDocument();
}
@TestDocument (doTestDocument="保存注解信息测验")
class MyAnnotation {

public void getInfo(){

}
}

@Target指定了注解所润饰目标的规模,可用于变量、参数、办法、包信息等。

@Target元注解供给如下的八个值:

  • ElementType.ANNOTATION_TYPE 用于描绘注解类型
  • ElementType.CONSTRUCTOR 用于注解结构办法
  • ElementType.FIELD 用于变量注解
  • ElementType.LOCAL_VARIABLE 用于局部变量注解
  • ElementType.METHOD 用于办法注解
  • ElementType.PACKAGE 用于包注解
  • ElementType.PARAMETER 用于办法内的参数注解
  • ElementType.TYPE 用于类、接口、枚举注解

代码示例:

@Target(ElementType.METHOD)
@interface TestMethodTarget{

}
@Target(ElementType.FIELD)
@interface TestFieldTarget{

}
@Target(ElementType.TYPE)
@interface TestTypeTarget{

}

TestMethodTarget注解只能用于注解类的办法,TestFieldTarget只能用于注解类的成员变量,TestTypeTarget可用于注解类、接口(包括注解类型) 或enum声明

@Inherited指定了注解可被承继。某个类运用了被@Inherited润饰的注解,那么那个注解也会用到该类的子类。

代码示例:

@Inherited
@interface TestInherited{

}

@Repeatable同一个注解可屡次运用。例如一个人有多种喜好,跑步、画画、看电影等。

示例代码:

@interface Persons {
Person[] value();
}
@Repeatable(Persons.class)
@interface Person{
String hobby default "";
}
@Person(hobby="runing")
@Person(hobby="drawing")
@Person(hobby="watching movies")
public class Tom{
}

上面的代码,@Repeatable 注解了 Person。而 @Repeatable后边括号中的类相当于一个容器注解。

什么是容器注解呢?便是用来寄存其它注解的当地。它本身也是一个注解。

上面具体介绍了注解的常识以及自界说注解的语法。现在咱们来看下怎么运用注解进行单元测验。

运用注解这要到反射的常识,关于反射的常识请看我的别的一篇文章“Java反射运用总结”。在得到反射目标后,要调用isAnnotationPresent办法这个目标是否包括指定类型的注解。 Annotation

示例代码:

public class Marathonrunner {
@RuningTest
public void test5km(){
System.out.println("进行5公里跑步测验");
}
public void test10km(){
System.out.println("进行10公里跑步测验");
}
@RuningTest
public void test21km(){
System.out.println("进行21公里跑步测验");
}
public void test42km(){
System.out.println("进行42公里跑步测验");
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface RuningTest{
}
public class RuntestTool {
public static void main(String args[]){
Marathonrunner xiaoming = new Marathonrunner();
Class clazz = xiaoming.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if(method.isAnnotationPresent(RuningTest.class)){
try {
method.setAccessible(true);
method.invoke(xiaoming, null);
} catch (Exception e) {
}
}
}
}
}

运转成果:

进行21公里跑步测验
进行5公里跑步测验

上面的代码,咱们界说了一个RuningTest注解,里边没有任何变量。这个注解运用@Retention和@Target元注解润饰,其间@Target元注解的值规则了这个RuningTest注解只能在办法上运用,而@Retention元注解值指定了在运转时能够获取到注解的信息。

界说了一个Marathonrunner马拉松远发动类,里边有4个办法。

界说了一个专门用于测验Marathonrunner运发动办法的类。假如咱们想测验某个类,只需在那个类上增加@RuningTest注解,不加@RuningTest注解的办法不会进行测验。test5km()和test21km()办法都加了@RuningTest注解,所以被测验到。极彩娱乐登录-Java中的注解运用:全面性的总结一下

注解在spring,mybatis注解中广发运用。下次专门写篇文章讲下spring中注解的运用。

总结:

本文首要讲解了注解的概念,元注解的概念,怎么自界说注解,以及怎么运用自己界说注解进行单元测验。

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP