最近一直在看aop,apt,javassist之类的东西。看的自己是一脸懵逼,只能说,android世界太大,自己太渺小,知识稍微懂了那么一些,还有很多遗落在那边,还没有理解完全。待我哪天开个天眼,再拿出来讲讲。
这次,主要讲讲这其中的注解。通过注解,aop可以很方便的切入一段代码。
元注解
云注解的作用就是负责注解其他注解。java5.0的时候,定义了4个标准的meta-annotation类型,它们用来提供对其他注解的类型作说明。
1.@Target
2.@Retention
3.@Documented
4.@Inherited
@Target: 规定Annotation所修饰的对象范围。有以下几种
1.ElementType.CONSTRUCTOR ; 构造器声明
2.ElementType.FIELD:成员变量、对象、属性(包括enum实例)
3.ElementType.LOCAL_VARIABLE; 局部变量声明
4.ElementType.METHOD ; 方法声明
5.ElementType.PACKAGE; 包声明
6.ElementType.PARAMETER;参数声明
7.ElementType.TYPE; 类、接口(包括注解类型)或enum声明
示例:
@Target(ElementType.TYPE)
public @interface Table{
public String value() default "";
}
@Target还支持填写数组,同时支持多种范围
@Target({ElementType.TYPE,ElementType.FIELD})
public @interface Test{}
@Retention:对Annotation的生命周期限制:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。
1.RetentionPolicy.SOUREC: 在源文件中有效
2.RetentionPolicy.CLASS; 在class文件中有效
3.RetentionPolicy.RUNTIME;在运行时有效
示例:
@Target(ElementType.FIELD)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column{
public String name() default ""
}
@Documented: 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员
示例
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column{
public String name() default "";
}
@Inherited: 是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将用于该class的子类。
示例:
@Inherited
public @interface Season{
public enum Sea{Spring,Summer,Autumn,Winter};
Sea sea() default Sea.Spring;
}
当然了,我们也是可以自定义注解的。
在使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口。
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
public String value(); //只有一个参数的时候,必须为value
}
类的支持注解如下:
@Description("这是类上的注解")
public class Person {
public String getName(){
return "";
}
}
方法的支持注解如下:
public class Coder extends Person{
@Override
@Description("这是方法上的注解")
public String getName() {
// TODO Auto-generated method stub
return "Mark";
}
}
@Inherited表示可以继承的
然后下面的这段代码就是注解的解析了,通过反射来拿到哪些注解
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.使用类加载器加载类
try {
Class c=Class.forName("com.annotation.Coder");
//2.找到类加载器上面的注解
boolean isExist=c.isAnnotationPresent(Description.class);
if(isExist){
//3 拿到注解实例
Description d=(Description) c.getAnnotation(Description.class);
System.out.println(d.value());
}
//4.找到方法上的注解
Method[] ms=c.getMethods();
for(Method m:ms){
boolean isMExist =m.isAnnotationPresent(Description.class);
if(isMExist){
Description d=m.getAnnotation(Description.class);
System.out.println(d.value());
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
ok~ 这就是完整的注解了,如有不懂,欢迎留言。
当然了,最大的同志交友网站,可以follow下我,时刻关注。https://github.com/zhairui