注解在java-1.5版本中引入的;
注解提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法;
一.java中的常见注解( JDK自带的注解 )
- @Override 代表子类实现父类的方法(注意:只要有该注解,父类必须定义该方法,否则子类会报错)
- @Deprecated() 如果父类或接口的某个方法发现以后不用了,但是之前继承该类的子类可能还在使用,所以不能直接删除,要使用
@Deprecated()
注解表示该方法已过时, 这时在子类实例化后使用该方法的时候,会产生警告信息,可以使用SuppressWarnings("desc")
忽略编辑器的警告
二.注解的分类
- 源码注解: 注解只在源码中存在,编译为class后注解就消失了,比如(@Override, @Deprecated,SuppressWarnings("desc"))
- 编译时注解: 注解在源码和class文件中都存在
- 运行时注解: 注解在运行阶段依然起作用,甚至会影响运行时的逻辑
- 元注解:注解的注解
三.自定义注解
-
使用自定义注解:
- 新建annotation注解
package comments;
/*
* 自定义注解
*/
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
* 元注解:注解的注解
*/
//注解的作用域,方法和类/接口
@Target({ ElementType.METHOD, ElementType.TYPE })
//注解的声明周期,在运行时起作用
@Retention(RetentionPolicy.RUNTIME)
//允许子类继承父类的注解,但不允许子类方法继承父类方法的注解
@Inherited
//生成javadoc时会包含注解
@Documented
public @interface Description {
//成员以无参无异常的方式声明
String desc();
String author();
int age() default 18;
}
- 在其他类中使用注解
package comments;
public class Child implements People {
@Override
@Description(author = "liangxifeng", desc = "获取人员姓名")
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
- 注解只有一个成员
public @interface Description {
String value();
}
@Description("只有一个成员的使用")
- 注解无成员
public @interface Description {
}
@Description()
四.解析注解
- 通过反射获取类,函数或成员上的
运行时
注解信息,从而实现动态控制程序运行的逻辑; - 在Child类中使用以上自定义的注解
@Description(author="liangxifeng", desc="我是Child类", age=28)
public class Child implements People {
@Override
@Description(author="lxf", desc="我是Child类中的getName方法")
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
- ParseAnn类中获取Child类中的类注解和方法注解信息
package comments;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* 解析注解
* @author lxf
*
*/
public class ParseAnn {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
//1. 使用类加载器加载类
Class c = Class.forName("comments.Child");
//2.找到类上面的注解
boolean isExit = c.isAnnotationPresent(Description.class);
//3.拿到注解实例
if(isExit)
{
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.age());//输出:28
}
//4.找到方法上的注解
Method[] ms = c.getMethods();
for (Method method : ms) {
boolean isExitM = method.isAnnotationPresent(Description.class);
if(isExitM)
{
Description d = (Description) method.getAnnotation(Description.class);
System.out.println(d.author()); //输出:lxf
}
}
//4.另外一种找到方法上的注解
for (Method m : ms) {
//获取所有注解
Annotation[] as = m.getAnnotations();
for(Annotation a : as)
{
if( a instanceof Description )
{
Description d = (Description)a;
System.out.println(d.author()); //输出:lxf
}
}
}
}
}