您的当前位置:首页正文

J2SE 8的注解

2024-11-05 来源:个人技术集锦

1. 注解概念

(1) 注解格式

modifiers @interface AnnotationName {
	type elementName();
	type elementName() default value;
}

示例

public @interface AnnotationExample {
    String assignedTo() default "value";
    int severity();
}

(2) 概念

Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。


元数据

Java与元数据
元数据是关于数据的数据。在编程语言上下文中,元数据是添加到程序元素如方法、字段、类和包上的额外信息。
元数据的作用
  一般来说,元数据可以用于创建文档,跟踪代码中的依赖性,执行编译时检查,代码分析。
元数据还可用于协助程序元素与框架或者EJB、EMF 和 TestNG这样的工具之间的通信。EJB 3.0就广泛地应用了Java元数据,通过元数据来实现声明性请求企业服务,依赖性以及资源注入,消除了严格的EJB组件模型约束,并且取代了复杂的XML配置文件。
元数据甚至使我们可以不用修改核心语言,就能够在 Java 语言中添加新功能,使核心语言成为一种开放式语言。在纯面向对象的语言中实现AOP就是使用元数据进行语言扩展的一个很好的例子。AspectWerkz、JBoss AOP以及AspectJ5 使用元数据将类的语义转换为一个aspect、将数据字段转换为一个pointcut、将方法转换为一个advice,等等。
Java平台的元数据
Java 元数据(Annotation)是 J2SE 5.0 (研发历时近三年,于2004年9月30日正式发布,代号为“Tiger”)新增加的功能之一,它在JSR-175规范中有详细定义。该机制允许在 Java 代码中添加自定义注释,并允许通过反射(reflection),以编程方式访问元数据注释。通过提供为程序元素附加额外数据的标准方法,元数据功能具有简化和改进许多应用程序开发领域的潜在能力,其中包括配置管理、框架实现和代码生成。

Annotation不直接影响程序的语义。然而,开发和部署工具可以读取这些注释,并以某种形式处理这些注释,可能生成其他 Java源程序、XML配置文件或者要与包含注释的程序一起使用的其他组件,从而影响运行状态的程序的语义。注释可以从源代码中读取,从编译后的.class文件中读取,也可以通过反射机制在运行时读取。

Annotation具有以下的一些特点:
元数据以标签的形式存在于Java代码中。
元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。
元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。
元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部。
事实上,早在JDK5.0推出语言级的元数据机制Annotation以前,就一直存在对元数据的需求。但是由于没有提供表达元数据的标准机制,出现了各种解决方案。下面罗列了一些例子
transient 关键字
Serializable 标记接口
xml 部署描述文件
manifest.mf 文件    
Javadoc 标记(将文档直接写在源程序里,极大的方便了文档的编写)
XDoclet(使用类似于JavaDoc的语法撰写描述信息,并使用工具生成描述文件)
这些方法都存在一定的局限性,比如使用关键字不具有扩展性,用户自定义新的关键字;标记接口没有提供额外的信息,它们不能带有参数,并且只能处理类,而不能处理字段或方法或包。Javadoc和XDoclet标记不会被编译器检查。

最后,我们再详细的对比一下Annotation和XML部署描述文件的优劣
XML配置文件与代码文件分离,不利于一致性维护,缺乏在运行时的反射机制。而Annotation与代码一起被编译器处理,并能够在运行时访问。
通常XML配置文件都很复杂而且冗长,为了配置代码,XML文件必须复制许多信息:比如代码中类名字和方法名字。Java注释则不同,它是代码的一部分,不需要额外的引用就可以指明配置信息。
XML配置文件是文本文件,没有显式的类型支持,需要到运行时刻才能发现隐藏的错误。而Annotation是类型安全的,它会被编译器检查。  
XML文件可以表达复杂的关系,但是在注释中我们却很难表达复杂的或层次的结构。
XML配置文件是在代码之外被单独处理的,也就是说基于XML的配置信息不是硬编码的,可以部署的时候进行修改。而修改Annotation则需要进行重新编译,不过我们可以利用AOP提供的机制为已有的代码添加Annotation。通过部署不同的AOP模块,就能使代码具有不同的Annotation,但比起直接修改XML显得复杂。
总而言之,注释是简单易用的,并且对大多数应用来说已经足够了。而XML文件更复杂,但具有部署的灵活性,因而被用来处理与部署相关的决策。注释与XML配置文件可以一起使用。由于注释只能保存相当少的配置信息,只有预先集成的框架组件(类似在框架组件中已经完成了大多数预备工作)可以广泛地把注释作为配置选项。而XML配置文件作为一个可选的重载机制,可以用于改变注释的默认行为。


http:///vebasan/article/details/4794699



  • 没带成员变量的Annotation被称为标记,这种注解仅利用自身的存在与否来提供信息,如@Override等。
  • 包含成员变量的Annotation称为元数据Annotation,因为他们提供更多元数据

(3)使用

1) 使用注解时,元素的值未指定,就使用默认的default值;

@AnnotationExample(severity = 1)
String example;

2) 均指定

@AnnotationExample(severity = 1, assignedTo="xyz")
String example;

3) type

注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组

注解中属性可以有默认值,默认值需要用 default 关键值指定

(4) 标记注解

1) 注解中没有任何元素

public @interface AnnotationExample {
}
@AnnotationExample
String example;

2) 注解中所有元素都使用默认值

public @interface AnnotationExample {
    String assignedTo() default "value";
    int severity() default 0;
}
@AnnotationExample
String example;

(5) 单值注解

元素具有特殊名字value(), 没有指定其它元素; 可以忽略这个元素名及等号

public @interface AnnotationExample {
	String value();
}
@AnnotationExample("the value")
String example;

(6) 注解约束

所有注解的元素值必须是编译期常量;

一个项可以有多个注解;

注解可以被重复使用;


2. 注解this

???

public boolean equals(@AnnotationExample AnnotationTest AnnotationTest.this, @AnnotationExample Object obj) {
    return false;
}


3. 元注解

可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
它的作用和目的就是给其他普通的标签进行解释说明的。

元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种.


@Documented

给javadoc这样的归档工具提示;被其注解过的方法的归档就会含有这条注解。

没有加@Documented

package annotation;

public @interface AnnotationExample {
    String assignedTo() default "value";
    int severity();
}

package annotation;

public class AnnotationTest {
	@AnnotationExample(severity = 1, assignedTo = "xyz")
	public String example;
	
	@AnnotationExample(severity = 2)
	public void foo() {
		
	}
}

加@Documented

package annotation;

import java.lang.annotation.Documented;

@Documented
public @interface AnnotationExample {
    String assignedTo() default "value";
    int severity();
}


package annotation;

public class AnnotationTest {
    @AnnotationExample(severity = 1, assignedTo = "xyz")
    public String example;
    
    @AnnotationExample(severity = 2)
    public void foo() {
        
    }
}

转载于:https://www.cnblogs.com/xiang--liu/p/9710364.html

Top