Java注解详解编程语言

 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。

那么什么是注解呢?举一个简单的例子。

@Override 
public String toString() { 
    return "This is String Representation of current object."; 
}

toString()方法使用了@Override注解。但是,即使我不使用@Override注解标记代码,程序也能够正常执行。@Override告诉编译器这个方法是一个重写方法(元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。如果我们不小心将toString()写错了,并且没有加@Override注解标签,编译器是会报错的。

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。

Aninotation遵循一个基本原则:不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行。

这里提到了元数据,那么什么是元数据。

元数据:关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。

综上所述:
    第一,元数据以标签的形式存在于Java代码中。
    第二,元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。
    第三,元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。
    第四,元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部。

注解的作用(优点和缺点):

编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

正式由于上面的特点,使我们在开发中也出现一些问题,入出现问题没办法快速定位错误,调试难度加大。但是这也不影响我们队注解的使用。

注解分类

根据注解参数的个数,我们可以将注解分为三类:

1.标记注解:一个没有成员定义的Annotation类型被称为标记注解。这种Annotation类型仅使用自身的存在与否来为我们提[email protected];
2.单值注解
3.完整注解

根据注解使用方法和用途,我们可以将Annotation分为三类:
1.JDK内置系统注解
2.元注解
3.自定义注解。

系统内置的常用的注解:

@Override:用于修饰此方法覆盖了父类的方法;
@Deprecated:用于修饰已经过时的方法;
@SuppressWarnnings:用于通知java编译器禁止特定的编译警告。


注解修饰

注解也可以添加注解的“注解”去修饰,J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:

@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target? –注解用于什么地方
@Inherited – 是否允许子类继承该注解

@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。

@Retention– 定义该注解的生命周期。
RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,[email protected], @SuppressWarnings都属于这类注解。
RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。


@Target – 表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,仅仅排除一个属性,那么你需要在定义target包含所有的属性。

ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息

@Inherited – 定义该注释和子类的关系

说了这么多,我们来自己定义注解吧

注解例子

自定义注解:

Java注解详解编程语言

/** 
SOURCE : 编译程序时处理完Annotation信息后就完成任务 
CLASS: 编译程序将Annotation存储于class文件中,不可以由虚拟机读入 
RUNTIME: 编译程序将Annotation存储于class文件中,可以由虚拟机读入 
 */ 
@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
public @interface TestAnnotation { 
	//无参数 
    String value(); 
    //有默认值的注解 
    String defaultValue() default ""; 
    //枚举参数 
    TestEnum testenum(); 
}


枚举类:

public enum TestEnum { 
	CANCEL {public String getName() {return "cancel";}}, 
	WAITE {public String getName() {return "waite";}}, 
	OK {public String getName() {return "ok";}}, 
}

测试

@TestAnnotation(value="value",defaultValue="test",testenum=TestEnum.CANCEL) 
public class Test { 
	public static void main(String[] args) { 
		TestAnnotation annotation=Test.class.getAnnotation(TestAnnotation.class); 
		System.out.println("annotation---"+annotation); 
	} 
}

输出结果:

Java注解详解编程语言


原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13036.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论