元注解
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种
@Inherited:说明子类可以继承父类中的该注解
@Document:说明该注解将被包含在javadoc中
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Retention:注解的保留位置
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
小例子:
1.自己定义一个注解
package com.Test;
import java.lang.annotation.*;
/**
* @Author: cxx
* @Date: 2018/3/15 11:47
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Cxx {
String value() default "haha";
}
2.写一个测试demo
package com.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @Author: cxx
* @Date: 2018/3/15 12:14
*/
public class CxxTest {
@Cxx(value = "test1")
public void test1(){
System.out.println("test1()方法");
}
@Cxx("test2")
public void test2(){
System.out.println("test2()方法");
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
Class clazz = CxxTest.class;
Method[] methods = clazz.getMethods();
for (Method method : methods) {
boolean flag = method.isAnnotationPresent(Cxx.class);
if (flag){
Cxx c = method.getAnnotation(Cxx.class);
System.out.println(c.value());
// method.invoke(clazz.getInterfaces(),args);
}
}
}
}
之后我们就能看到运行结果中test1,test2都打印出来了
这里再介绍invok的用法:
首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, InstantiationException {
Class clazz = CxxTest.class;
Method[] methods = clazz.getMethods();
for (Method method : methods) {
boolean flag = method.isAnnotationPresent(Cxx.class);
if (flag){
Cxx c = method.getAnnotation(Cxx.class);
System.out.println("注解传入的参数:"+c.value());
method.invoke(clazz.newInstance());
}
}
}
转载:https://blog.csdn.net/m0_37499059/article/details/79566241
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |