JAVA注解介绍
前言
在我们的日常学习和编写项目的时候可能会遇到一些写在类、方法上或者是变量上的注解,比如:
@Componet
public class Hello{
@Override
public String toString(){
return "";
}
}
这些注解有的可以帮助我们解决很多的问题,比如:@Override帮我们解决方法是否是重写的,Spring中的@Compoent帮我们把类注入IOC容器,AOP提供的注解简单就完成了切面的增强…
为什么一个简单注解可以解决这么多的问题?
这次我就对注解进行一个简单的入门帮大家简单了解一下注解魅力!!
一个大佬写的有关注解的博客:传送门
正文
注解基础知识点
定义:注解(Annotation),也叫元数据
。一种代码级别的说明
。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举
是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
注意:百度百科其实说的比较明白了注解其实是对元素进行说明的,其实就和注释一样。它本身并不具备各种逻辑功能
,比如@Override的源代码:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
这整个头就是注解
了:
注意:
- 注解就和一个类一样,
既可以没有属性也可以没有功能
,但一般这种情况几乎没有。 - 注解的功能不一定被定义域注解域中(可以理解为类的方法不在本类中),这个要是情况而定
- 注解内部的属性的类型只支持
基本数据类型、String、枚举
,支持在内部创建枚举。
-
注解(Annotations)的四大元注解
上述的@Documented @Inherited @Target(ElementType.METHOD,) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation {}
@Documented
、@Inherited
、@Target
、@Retention
四个注解就是元注解,我们所有自定义的注解一般都绕不开它们。-
@Target:
此注解的取值将影响注解的使用地点
,是类注解还是方法注解等。当去只取一个的时候直接填写值即可,多个的时候以value={}
的数组形式填写。可取的值
ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息 -
@Retention:
此注解的取值将影响注解的生命周期
,换句话说就是注解在什么时候被销毁,这将影响到注解的功能。
可取的值
,只能选择其一
RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。
RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。- @Documented:
此注解表示是否将该注解的信息加入java文档 - @Inherited:
定义该注释和子类的关系
-
实践
这个例子只是注解的简单入门使用,会加上注解的功能,会涉及到反射的用法,但是代码结构简单。代码的大致结构也是按照上一篇博客给出的链接所编写
// 注解定义
@Target(value = {ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public enum FLAG{TRUE, FLASE}
public enum STATUS{BEFORE, ING, AFTER}
public String Author() default "lxx";
public FLAG Flag() default FLAG.FLASE;
public STATUS Status();
}
// 注解功能类 定义了注解功能
public class LoadMyAnnotation {
public static void LoadMyAnnotationA(){
// 获取含有注解的类的Class
Class myannotation = ImpClass.class;
for (Method method : myannotation.getMethods()){
// 这个方法使用了泛型处理
MyAnnotation temp = method.getAnnotation(MyAnnotation.class);
if(temp != null){
System.out.println("Method Name" + method.getName());
System.out.println("Autor:" + temp.Author());
System.out.println("Flag:" + temp.Flag());
System.out.println("Status:" + temp.Status());
}
}
}
}
// 注解使用类
public class ImpClass {
@MyAnnotation(Author = "假人", Flag = MyAnnotation.FLAG.TRUE, Status = MyAnnotation.STATUS.BEFORE)
public void Helloword(){
System.out.println("helloword");
}
}
// Main方法测试类
public class Client{
public static void main(String[] args) throws Exception {
// 加载注解 会输出ImpClass注解中定义的属性和"helloword"
LoadMyAnnotation.LoadMyAnnotationA();
// 调用 没有任何的变化
ImpClass impClass = new ImpClass();
impClass.Helloword();
}
}
总结
这篇博客所介绍关于注解的部分仅仅是个入门,在JAVA庞大的开源和商业框架中,注解的种类和功能千遍万化,本文章仅仅是入门前的台阶,希望大家能抛去浮躁认真学习。