1.自定义注解实现——判断接口是否需要验证MD5
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface checkAnnotation {
boolean check() default false;
String privateKey() default "testforblog";
/**
* md5方法加密
*/
String[] fields() default {};
}
2.常用参数定义
@Documented //表明这个注解应该被javadoc工作记录
@Target(ElementType.METHOD)//指定注解的使用位置
@Inherited //是一个标记注解,指定被标注的类型是被继承的
如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Retention(RetentionPolicy.RUNTIME) //指定注解保留多长时间
3.详解@Inherited
注解和普通类的区别是如果一个子类想获取到父类上的注解信息,那么必须在父类上使用的注解上面 加上@Inherited关键字 。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ATable {
public String name() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BTable {
public String name() default "";
}
@ATable
public class Super {
private int superx;
public int supery;
public Super() {
}
private int superX(){
return 0;
}
public int superY(){
return 0;
}
}
@BTable
public class Sub extends Super{
private int subx;
public int suby;
private Sub()
{
}
public Sub(int i){
}
private int subX(){
return 0;
}
public int subY(){
return 0;
}
}
public class TestMain {
public static void main(String[] args) {
Class<Sub> clazz = Sub.class;
System.out.println("============================Field===========================");
System.out.println(Arrays.toString(clazz.getFields()));
System.out.println(Arrays.toString(clazz.getDeclaredFields())); //all + 自身
System.out.println("============================Method===========================");
System.out.println(Arrays.toString(clazz.getMethods())); //public + 继承
//all + 自身
System.out.println(Arrays.toString(clazz.getDeclaredMethods()));
System.out.println("============================Constructor===========================");
System.out.println(Arrays.toString(clazz.getConstructors()));
System.out.println(Arrays.toString(clazz.getDeclaredConstructors()));
System.out.println("============================AnnotatedElement===========================");
//注解DBTable2是否存在于元素上
System.out.println(clazz.isAnnotationPresent(BTable.class));
//如果存在该元素的指定类型的注释DBTable2,则返回这些注释,否则返回 null。
System.out.println(clazz.getAnnotation(BTable.class));
//继承
System.out.println(Arrays.toString(clazz.getAnnotations()));
System.out.println(Arrays.toString(clazz.getDeclaredAnnotations())); 自身
}
}
(1)getFields()获得某个类的所有的公共(public)的字段,包括父类。
(2)getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
(3)同样method和constructor的打印也是如此。
(4)clazz.getAnnotations()可以打印出当前类的注解和父类的注解
clazz.getDeclaredAnnotations()只会打印出当前类的注解
运行结果:
============================Field===========================
[public int annotion.inherit.Sub.suby, public int annotion.inherit.Super.supery]
[private int annotion.inherit.Sub.subx, public int annotion.inherit.Sub.suby]
============================Method===========================
[public int annotion.inherit.Sub.subY(), public int annotion.inherit.Super.superY(), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
[private int annotion.inherit.Sub.subX(), public int annotion.inherit.Sub.subY()]
============================Constructor===========================
[public annotion.inherit.Sub(int)]
[private annotion.inherit.Sub(), public annotion.inherit.Sub(int)]
============================AnnotatedElement===========================
true
@annotion.inherit.BTable(name=)
[@annotion.inherit.ATable(name=), @annotion.inherit.BTable(name=)]
[@annotion.inherit.BTable(name=)]
(5)如果注解ATable把@Inherit去掉。那么后面四行的输出结果如下,证明如果一个子类想获取父类上的注解信息,比必须在父类的注解上使用Inherited关键字。
true
@annotion.inherit.BTable(name=)
[@annotion.inherit.BTable(name=)]
[@annotion.inherit.BTable(name=)]