Answers:
注释是元元对象,可用于描述其他元对象。元对象是类,字段和方法。向一个对象索要其元对象(例如anObj.getClass()
)称为自省。内省可以走得更远,我们可以问一个元对象其注释是什么(例如aClass.getAnnotations
)。内省和注释属于所谓的反射和元编程。
注释需要以一种或另一种方式解释才有用。注释可以在开发时由IDE或编译器解释,也可以在运行时由框架解释。
注释处理是一种非常强大的机制,可以通过多种不同方式使用:
@Deprecated, @Override
或@NotNull
@Entity, @TestCase, @WebService
@Statefull, @Transaction
@Column, @XmlElement
在所有情况下,都使用注释来描述元素并阐明其含义。
在JDK5之前,现在需要将带有注释表示的信息存储在其他位置,并且XML文件经常被使用。但是使用注释更方便,因为它们将属于Java代码本身,因此比XML更易于操作。
注释的用法:
...例如看一下Lombok项目,该项目使用批注定义了生成方法equals
或hashCode
方法。
Java的注释有多种应用程序。首先,它们可能由编译器(或编译器扩展)使用。考虑例如Override注释:
class Foo {
@Override public boolean equals(Object other) {
return ...;
}
}
这实际上是内置在Java JDK中的。如果标记了某些方法,则编译器将发出错误信号,该错误不会覆盖从基类继承的方法。为了避免常见的错误,此注释可能会有所帮助,因为您实际上打算覆盖某个方法,但这样做却失败了,因为您的方法中给定的签名与被覆盖的方法的签名不匹配:
class Foo {
@Override public boolean equals(Foo other) { // Compiler signals an error for this one
return ...;
}
}
从JDK7开始,注释可以在任何类型上使用。现在可以将此功能用于编译器注释,例如 NotNull之类的,例如:
public void processSomething(@NotNull String text) {
...
}
这样,编译器就可以警告您有关变量和空值使用不当/未经检查的情况。
注释的另一个更高级的应用程序涉及在运行时进行反射和注释处理。这是(我认为)当您将批注称为“基于XML的配置的替换”时所想到的。这是一种注释处理,例如,各种框架和JCP标准(持久性,依赖项注入,您将其命名)都使用了这种注释处理,以提供必要的元数据和配置信息。
注释是添加到Java源文件中的元数据(关于数据的数据)的一种形式。框架广泛使用它们来简化客户端代码的集成。我想到了几个真实的例子:
JUnit 4-将@Test
注释添加到要运行JUnit运行器的每个测试方法中。设置测试也有其他注释(如@Before
和@BeforeClass
)。所有这些都由JUnit运行器处理,JUnit运行器相应地运行测试。您可以说它是XML配置的替代品,但是注释有时更强大(例如,它们可以使用反射),并且它们更接近于它们所引用的代码(@Test
注释就在测试方法之前,因此目的是该方法的含义很明确-也可以用作文档)。另一方面,XML配置可能比注释更复杂,并且可以包含更多的数据。
Terracotta-同时使用注释和XML配置文件。例如,@Root
注释告诉Terracotta运行时该注释字段是根,并且其内存应在VM实例之间共享。XML配置文件用于配置服务器并告诉它要检测的类。
Google Guice-一个示例就是@Inject
注释,将其应用于构造函数后,Guice运行时将根据定义的注入器为每个参数查找值。该@Inject
注释将是十分困难的使用XML配置文件进行复制,并且它靠近它引用到构造是非常有用的(想象一下,搜索到一个巨大的XML文件来找到所有你已经设置了依赖注入)。
希望我给您带来了如何在不同框架中使用注释的信息。
Java注释提供了一种描述类,字段和方法的方法。本质上,它们是添加到Java源文件中的元数据的一种形式,它们不能直接影响程序的语义。但是,可以在运行时使用Reflection读取注释,并且此过程称为自省。然后可以将其用于修改类,字段或方法。
库和SDK(hibernate,JUnit,Spring Framework)经常利用此功能来简化或减少程序员在不使用这些库或SDK的情况下将要执行的代码量。反射工作与Java紧密结合。
我们还将注释的可用性限制为编译时或运行时。以下是创建自定义注释的简单示例
驱动程序
package io.hamzeen;
import java.lang.annotation.Annotation;
public class Driver {
public static void main(String[] args) {
Class<TestAlpha> obj = TestAlpha.class;
if (obj.isAnnotationPresent(IssueInfo.class)) {
Annotation annotation = obj.getAnnotation(IssueInfo.class);
IssueInfo testerInfo = (IssueInfo) annotation;
System.out.printf("%nType: %s", testerInfo.type());
System.out.printf("%nReporter: %s", testerInfo.reporter());
System.out.printf("%nCreated On: %s%n%n",
testerInfo.created());
}
}
}
TestAlpha.java
package io.hamzeen;
import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;
@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {
}
IssueInfo.java
package io.hamzeen;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author Hamzeen. H.
* @created 10/01/2015
*
* IssueInfo annotation definition
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {
public enum Type {
BUG, IMPROVEMENT, FEATURE
}
Type type() default Type.BUG;
String reporter() default "Vimesh";
String created() default "10/01/2015";
}
它可以替代基于XML的配置吗?
并非完全,但是与代码结构(例如,JPA映射或Spring中的依赖项注入)紧密对应的配置通常可以用注释替换,因此通常不会那么冗长,烦人和痛苦。尽管旧的XML配置通常仍然是一个选项,但几乎所有值得注意的框架都进行了此切换。
注释可以应用于声明:类,字段,方法和其他程序元素的声明。当在声明上使用时,每个注释通常会按照惯例出现在自己的行上。
Java SE 8 Update:注解也可以应用于类型的使用。这里有些例子:
类实例创建表达式:
新的@Interned MyObject();
类型转换:
myString =(@NonNull字符串)str;
实现子句:
类UnmodifiableList实现@Readonly List <@Readonly T> {...}
引发异常声明:
void monitorTemperature()引发@Critical TemperatureException {...}
像Hibernate这样的框架需要大量配置/映射,因此大量使用Annotations。
JPA(来自Java EE 5)是(过度)使用注释的一个很好的例子。Java EE 6还将在许多新领域中引入注释,例如RESTful Web服务和在每个良好的旧Servlet API下的新注释。
以下是一些资源:
注解不仅可以/可以被注释所接管,而且还可以用来控制行为。您可以在Java EE 6的JAX-RS示例中看到这一点。
它通过(a)编译器检查或(b)代码分析来附加有关代码的其他信息。
**
**
类型1)应用于Java代码的注释:
@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj)
@Deprecated // indicates the deprecated method
Public doSomething()....
@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})
类型2)应用于其他注释的注释:
@Retention - Specifies how the marked annotation is stored—Whether in code only, compiled into the class, or available at run-time through reflection.
@Documented - Marks another annotation for inclusion in the documentation.
@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to
@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).
**
** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations
为了更好地理解尝试,请点击以下链接:详细说明
注释可以用作外部配置文件的替代方法,但不能视为完全替代。您可以找到许多示例,其中已经使用注解替换了配置文件,例如Hibernate,JPA,EJB 3以及Java EE中包含的几乎所有技术。
无论如何,这并不总是一个好的选择。使用配置文件的目的通常是将代码与运行应用程序的环境的细节分开。在这种情况下,通常是在使用配置将应用程序映射到外部系统的结构时,注释不能很好地替代配置文件,因为注释使您可以将外部系统的详细信息包含在的源代码中。你的申请。在这里,外部文件被认为是最佳选择,否则,您每次在执行环境中更改相关细节时,都需要修改源代码并重新编译。
注释更适合用额外的信息来修饰源代码,这些信息指示处理工具在编译时和运行时以特殊方式处理类和类结构。@Override
和JUnit的@Test
这种用法的很好的例子,在其他答案中已经详细解释了。
最后,规则始终是相同的:将随源而变化的事物保持在源内,而将与源无关的变化事物保持在源外。
以下是一些可以使用注释的地方。
a. Annotations can be used by compiler to detect errors and suppress warnings
b. Software tools can use annotations to generate code, xml files, documentation etc., For example, Javadoc use annotations while generating java documentation for your class.
c. Runtime processing of the application can be possible via annotations.
d. You can use annotations to describe the constraints (Ex: @Null, @NotNull, @Max, @Min, @Email).
e. Annotations can be used to describe type of an element. Ex: @Entity, @Repository, @Service, @Controller, @RestController, @Resource etc.,
f. Annotation can be used to specify the behaviour. Ex: @Transactional, @Stateful
g. Annotation are used to specify how to process an element. Ex: @Column, @Embeddable, @EmbeddedId
h. Test frameworks like junit and testing use annotations to define test cases (@Test), define test suites (@Suite) etc.,
i. AOP (Aspect Oriented programming) use annotations (@Before, @After, @Around etc.,)
j. ORM tools like Hibernate, Eclipselink use annotations
您可以参考此链接以获取有关注释的更多详细信息。
您可以参考此链接,以了解如何使用批注构建简单的测试套件。