本文主要是介绍Java:通过反射解析自定义注解的并顺序执行被注解标注的方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 创建自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//这里的 @Target和 @Retention 注解为元注解(就是Java中提供的用来定义注解的注解)
//定义注解标注的位置 TYPE:类 METHOD:方法
@Target({ElementType.METHOD,ElementType.TYPE})
//约束注解的生命周期 runtime:此注解会存在于源码,class文件,运行时内存
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
int index() default 0;
}
- 创建一个类来使用自定义注解
public class MybookTest {
@Book(index = 3)
public void show1(){
System.out.println("正在执行show1()");
}
@Book(index = 1)
public void show2(){
System.out.println("正在执行show2()");
}
@Book(index = 0)
public void show3(){
System.out.println("正在执行show3()");
}
@Book(index = 2)
public void show4(){
System.out.println("正在执行show4()");
}
}
- 通过反射解析自定义类并运行方法
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Comparator;
public class DemoAnontation {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = Class.forName("com.itheima.annotation.MybookTest");
//反射调用空参构造来实例化对象
Object obj = aClass.getConstructor().newInstance();
//获取对象中所有的方法
Method[] methods = aClass.getMethods();
//根据获取到的所有 方法中使用 @Book注解的并根据注解属性的 index 值进行排序
Arrays.sort(methods, new Comparator<Method>() {
public int compare(Method o1, Method o2) {
if(o1.isAnnotationPresent(Book.class) &&
o2.isAnnotationPresent(Book.class)){
//2.取出每个方法的@Book 注解对象
Book t1 = o1.getAnnotation(Book.class);
Book t2 = o2.getAnnotation(Book.class);
//3.取出每个注解的 index 属性值
int index1 = t1.index();
int index2 = t2.index();
return index1 - index2;
}
return 0;
}
});
//获取每一个方法并反射执行方法
for (Method method : methods) {
if (method.isAnnotationPresent(Book.class)){
//通过 obj 对象来执行 method 方法
method.invoke(obj);
}
}
}
}
- 执行结果如下
这篇关于Java:通过反射解析自定义注解的并顺序执行被注解标注的方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!