上面一篇介绍了注解的基本概念,这篇主要是注解的自定义开发以及解析注解
一.自定义注解:
这里创建了一个加在方法上以及类上的注解:
package com.ann.test;
import java.lang.annotation.*;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String desc();
String author();
int age() default 18;
}
使用:
package com.ann.test;
public class Child implements Person{
@Override
@Description(desc="miaoshu",author = "sqz")
public String name() {
return null;
}
@Override
public String age() {
return null;
}
@Override
public String sing() {
return "zhangsan";
}
}
这时候是加在类上与方法上的注解,我们把ElementType.TYPE去掉,那么在类上再加注解就会报错
二:解析注解:
概念:通过反射获取类,函数,变量上的运行时注解信息,从而实现动态控制程序的运行逻辑
注解类定义:
package com.ann.test;
import java.lang.annotation.*;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String value();//此时只有一个成员,只能用value()
}
使用类:
package com.ann.test;
@Description("i am class annotation")
public class Child implements Person{
@Override
@Description("i am method annotation")
public String name() {
return null;
}
@Override
public String age() {
return null;
}
@Override
public String sing() {
return "zhangsan";
}
}
解析类:
package com.ann.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class ParseAnno {
public static void main(String[] args) {
//1.使用类加载器加载类
try {
Class c = Class.forName("com.ann.test.Child");
//2.找到类上面的注解
boolean isexists = c.isAnnotationPresent(Description.class);//这个类上是否存在Description注解
if (isexists){
//3.如果存在就拿到注解实例
Description description = (Description) c.getAnnotation(Description.class);
System.out.println(description.value());//打印属性
}
//4.找到方法上的注解
Method[] methods = c.getMethods();
//方式一:
for (Method m:methods){
boolean isMeAno = m.isAnnotationPresent(Description.class);
//如果方法上的注解是Description,就拿到注解实例
if (isMeAno){
Description description = m.getAnnotation(Description.class);
System.out.println(description.value());
}
}
//方式二:
for (Method m:methods){
//拿到方法上所有注解
Annotation[] as = m.getAnnotations();
for (Annotation a :as){
if (a instanceof Description){
Description d = (Description)a;
System.out.println(d.value());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
结果:
注意:如果把注解生命周期改成 CLASS或者SOURCE则不能打印出任何结果,只能是运行时注解
还有就是注解的继承只能写在类上,不能加在接口上