注解分类
源码注解:注解只在源码中存在,在class中就不存在了
编译时注解:注解在源码和class文件中都存在
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解
自定义注解
/****元注解****/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
/****************/
public @interface Description {
String desc();//成员变量 无参数无异常的方式声明
String author();
int age() default 18;//设置默认值
}
成员类型包含基本类型,String,Class,Annotation,Enumeration
如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
元注解
@Target 作用域
CONSTRUCTOR 构造方法声明
FIELD字段声明
LOCAL_VARIABLE局部变量声明
METHOD方法声明
PACKAGE包声明
PARAMETER参数声明
TYPE类,接口
@Retention 生命周期(注解分类)
SOURCE
CLASS
RUNTIME
@Inherited 容许子类继承
@Documented 生成javadoc时会包含注解
解析注解
public static void main(String[] args) {
try {
Class c = Class.forName("com.evilsoulm.anotationdemo.MainActivity");
//找到类上的注解 boolean isExist = c.isAnnotationPresent(Description.class);
if (isExist) {
//拿到注解实例
Description d = (Description) c.getAnnotation(Description.class);
System.out.println("descrition:" + d.desc());
}
Method[] ms = c.getMethods();
for (Method m : ms) {
boolean isMethodExist = m.isAnnotationPresent(Description.class);
if (isMethodExist) {
//拿到注解实例 Description d = m.getAnnotation(Description.class);
System.out.println("descrition:" + d.desc());
}
}
//解析方式2
for (Method m : ms) {
Annotation[] as = m.getAnnotations();
for (Annotation a : as) {
if (a instanceof Description) {
Description d = (Description) a;
System.out.println("descrition:" + d.desc());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Description(desc = "EvilsoulM")
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Description(desc = "i am eyeColor", age = 24)
public void eyeColor() {
}
}
descrition:EvilsoulM
descrition:i am eyeColor
descrition:i am eyeColor
网友评论