西伯利亚新闻与中俄新闻!

忘记密码

Java Annotation 必须控制的 特点

2019-05-03 05:38 作者: 来源: 本站 浏览: 8 次 我要评论Java Annotation 必须控制的 特点已关闭评论 字号:

摘要: 什么是Annotation? Annotation翻译为中文即为注解,意思就是供给除了法度榜样本身逻辑外的 额外的 数据信息。Annotation对于标注的 代码没有直接的 影响,它弗成以直接与标注的 代码产生交互,但其他组件可以应用这些信息。 Annotat...

什么是Annotation?

Annotation翻译为中文即为注解,意思就是供给除了法度榜样本身逻辑外的 额外的 数据信息。Annotation对于标注的 代码没有直接的 影响,它弗成以直接与标注的 代码产生交互,但其他组件可以应用这些信息。

Annotation信息可以被编译进class文件,也可以保存在Java 虚拟机中,广州java培训Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。,从而在运行时可以获取。甚至对于Annotation本身也可以加Annotation。

哪些对象可以加Annotation

类,办法,变量,参数,包都可以加Annotation。

内置的 Annotation

@Override 重载父类中办法 @Deprecated 被标注的 办法或类型已不再推荐应用
@SuppressWarnings 阻拦编译时的 警告信息。其须要接收一个String的 数组作为参数。 可供应用的 参数有

unchecked
path
serial
finally
fallthrough

可以用与其他annotation上的 annotation

@Retention
肯定Annotation被保存的 生命周期, 须要接收一个Enum对象RetentionPolicy作为参数。
public enum RetentionPolicy {

/**

* Annotations are to be discarded by the compiler.

*/

SOURCE,

/**

* Annotations are to be recorded in the class file by the compiler

* but need not be retained by the VM at run time.  This is the default

* behavior.

*/

CLASS,

/**

* Annotations are to be recorded in the class file by the compiler and

* retained by the VM at run time, so they may be read reflectively.

*

* @see java.lang.reflect.AnnotatedElement

*/

RUNTIME
}

@Documented 文档化
@Target
表示该Annotation可以润饰的 范围,接收一个Enum对象EnumType的 数组作为参数。
public enum ElementType {

/** Class, interface (including annotation type), or enum declaration */

TYPE,

/** Field declaration (includes enum constants) */

FIELD,

/** Method declaration */

METHOD,

/** Parameter declaration */

PARAMETER,

/** Constructor declaration */

CONSTRUCTOR,

/** Local variable declaration */

LOCAL_VARIABLE,

/** Annotation type declaration */

ANNOTATION_TYPE,

/** Package declaration */

PACKAGE
}

@Inherited
该Annotation可以影响到被标注的 类的 子类。

自定义Annotation

JSE5.0今后我们可以自定义Annotation。下面就是一个简单的 例子。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {

}

下面的 Person对象应用了自定义的 MethodAnnotation。
public class Person {

public void eat() {

System.out.println(“eating”);

}

@MethodAnnotation

public void walk() {

System.out.print(“walking”);

}

}

我们可以经由过程反射获取Annotation的 信息。
Class<Person> personClass = Person.class;

Method[] methods = personClass.getMethods();

for(Method method : methods){

if (method.isAnnotationPresent(MethodAnnotation.class)){

method.invoke(personClass.newInstance());

}

}

输出
walking

我们也可以给自定义的 Annotation加办法。
@Target(ElementType.TYPE)
public @interface personAnnotation {

int id() default 1;

String name() default “bowen”;
}

下面是对personAnnotation的 应用。
@personAnnotation(id = 8, name = “john”)
public class Person {

public void eat() {

System.out.println(“eating”);

}

@MethodAnnotation

public void walk() {

System.out.print(“walking”);

}

}

Annotation是若何被处理的

当Java源代码被编译时,编译器的 一个插件annotation处理器则会处理这些annotation。处理器可以产生申报信息,或者创建附加的 Java源文件或资本。假如annotation本身被加上了RententionPolicy的 运行时类,则Java编译器则会将annotation的 元数据存储到class文件中。然后,Java虚拟机或其他的 法度榜样可以查找这些元数据并做响应的 处理。

当然除了annotation处理器可以处理annotation外,我们也可以应用反射本身来处理annotation。Java SE 5有一个名为AnnotatedElement的 接口,Java的 反射对象类Class,Constructor,Field,Method以及Package都实现了这个接口。这个接口用来表示当前运行在Java虚拟机中的 被加上了annotation的 法度榜样元素。经由过程这个接口可以应用反射读取annotation。AnnotatedElement接口可以拜访被加上RUNTIME标记的 annotation,响应的 办法有getAnnotation,getAnnotations,isAnnotationPresent。因为Annotation类型被编译和存储在二进制文件中就像class一样,所以可以像查询通俗的 Java对象一样查询这些办法返回的 Annotation。

Annotation的 广泛应用

Annotation被广泛用于各类框架和库中,下面就列举一些典范的 应用.

Junit

Junit是异常有名的 一款单位测试框架,应用Junit的 时刻须要接触年夜量的 annotation。

@Runwith 自定义测试类的 Runner
@ContextConfiguration 设置Spring的 ApplicationContext
@DirtiesContext 当履行下一个测试前从新加载ApplicationContext.
@Before 调用测试办法前初始化
@After 调用测试办法后处理
@Test 注解该办法是测试办法
@Ignore 可以加在测试类或测试办法上,忽视运行。
@BeforeClass在该测试类中的 所有测试办法履行前调用,只被调用一次(被标注的 办法必须是static)
@AfterClass在该测试类中的 所有的 测试办法履行完后调用,只被履行一次(被标注的 办法必须是static)

Spring

Spring 号称设备地狱,Annotation也不少。

@Service 给service类加注解
@Repository 给DAO类加注解
@Component 给组件类加注解
@Autowired 让Spring主动装配bean
@Transactional 设备事物
@Scope 设备对象存活范围
@Controller 给控制器类加注解
@RequestMapping url路径映射
@PathVariable 将办法参数映射到路径
@RequestParam 将请求参数绑定到办法变量
@ModelAttribute 与model绑定
@SessionAttributes 设置到session属性

Hibernate

@Entity 润饰entity bean
@Table 将entity类与数据库中的 table映射起来
@Column 映射列
@Id 映射id
@GeneratedValue 该字段是自增长的
@Version 版本控制或并发性控制
@OrderBy 排序规矩
@Lob 年夜对象标注

Hibernate还丰年夜量的 关于结合的 annotation和持续的 annotation,这里就不料义列举了。

JSR 303 – Bean Validation

JSR 303 – Bean Validation是一个数据验证的 规范,其对Java bean的 验证重要经由过程Java annotation来实现。

@Null被注释的 元素必须为 null
@NotNull被注释的 元素必须不为 null
@AssertTrue被注释的 元素必须为 true@AssertFalse被注释的 元素必须为 false@Min(value)被注释的 元素必须是一个数字,其值必须年夜于等于指定的 最小值
@Max(value)被注释的 元素必须是一个数字,其值必须小于等于指定的 最年夜值
@DecimalMin(value)被注释的 元素必须是一个数字,其值必须年夜于等于指定的 最小值
@DecimalMax(value)被注释的 元素必须是一个数字,其值必须小于等于指定的 最年夜值
@Size(max, min)被注释的 元素的 年夜小必须在指定的 范围内
@Digits (integer, fraction)被注释的 元素必须是一个数字,其值必须在可接收的 范围内
@Past被注释的 元素必须是一个以前的 日期
@Future被注释的 元素必须是一个将来的 日期
@Pattern(value)被注释的 元素必须相符指定的 正则表达式

其实还有很多应用了annotaion的 framework或library,这里就不一一列举了,欲望年夜家能触类旁通,深刻懂得Java中的 annotation。

  ☞评论暂时关闭,有事请直接联系本站客服,谢谢!