注解: Annotation
作用:主要是用来替代xml的配置文件。
存在的位置:在对应的Java类中
使用的范围:用于修饰包,类,构造器,方法,成员变量,参数和局部变量的声明。
存储形式:key\value形式.
注意:不影响原本的代码执行.
* 注解与XML的区别:
* 注解:
* 优点:
* 直观,简单.
* 配置方式容易.
* 缺点:
* 配置信息相对过于零散.
* 修改过于麻烦(重新编译)
* XML:
* 优点:
* 与Java类逻辑的关系低耦合.
* 复用性.
* 修改很简单(不用编译)
* 缺点:
* 编写过于复杂.
* 解析操作过于复杂.
* Java中提供三个基本注解:
* @Override:限定重写父类方法
* 用处:当一个类继承于另一个类,并重写其提供的方法时.
* @Deprecated:标示已过时
* 作用:保证软件或系统版本更新,对版本的兼容性(新版本只能增加内容,不能修改及删除).
* @SuppressWarnings:抑制编译器警告
* 范围:作用在类、方法、成员变量等.
public class Person {
public void fun1() {
}
}
public class FanBingBing extends Person{
@myanno(addr="beijing",jbo="jiaozhu",name="zhangwuji")
private int b=0;
@myanno(addr="beijing",jbo="jiaozhu",name="zhangwuji")
public void fun1() {
// TODO Auto-generated method stub
super.fun1();
}
@myanno(addr="YUIKal小区",job="zhangmen",name="zhaomin")
public void fun2() {
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface myanno {
String name();
String jbo();
String addr();
}
- 自定义注解:
- 使用关键字 @interface.
- 定义属性:
- 语法:类型 属性名称();
- 使用属性时:
- @注解名称(属性名=属性值,属性名=属性值,…)
- 一旦自定义注解时,定义属性:一定是必要属性.
- 支持的类型:基本类型、String、Enum、Class及上述类型的一维数组类型.
- 注意:
- 如果自定义注解,只定义value属性(没有任何其他属性)
String value();
- 如果自定义注解,只定义value属性(没有任何其他属性)
- 注意:
- 使用该注解时,可以省略”value=”(可以直接指定属性值,而不定义属性名)
@MyAnno(“”)
- @Target注解:
- 作用:
- 用于修饰自定义注解.
- 用于指定该自定义注解允许修饰Java类的哪个部分(类、成员变量、方法等).
- 该注解包含ElementType类型的value属性.
- @Retention注解:
- 作用:
- 用于修饰自定义注解.
- 指定该自定义注解的生命周期.(生命周期 - SOURCE、CLASS、RUNTIME)
通过反射读取注解:
- 前提:自定义注解只能是RUNTIME.
使用Annotation修饰了类、方法、成员变量等之后,这些Annotation不会自己生效,必须通过相应程序提取并处理Annotation信息。Java提供的Annotation接口是所有注解的父接口,在JDK 5.0新增加AnnotatedElement接口,该接口提供读取运行时Annotation的方法。只有当自定义的Annotation使用了@Retention(RetentionPolicy.RUNTIME)时,该Annotation才会在运行可见,JVM才能读取保存在class文件的Annotation信息。
- 作用:
import java.lang.reflect.Method;
//反射读取Annotation
public class AnnotatedElementTest {
public static void main(String[] args) throws Exception
{
// 获取对应类的Class对象.
Class clazz= FanBingBing.class;
// 获取对应类方法的Method对象.
Method method= clazz.getMethod("fun2" );
// 获取类上的注解.
myanno anno = method.getAnnotation(myanno.class);
//测试
System.out.println(anno.name());
}
}