美文网首页
反射 注解 应用

反射 注解 应用

作者: 勇者与王者 | 来源:发表于2020-10-20 22:30 被阅读0次

今天才知道Java的反射这么强大,可以完全不知道方法名、参数、返回值就能进行方法调用,而且还能拿到方法的返回值,遍历返回值中的集合等。

自定义注解:

package Reflect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @ClassName TestMethod
 * @description:
 * @author: isquz
 * @time: 2020/10/20 22:08
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestMethod {
    String params();
}

方法使用注解:

package Reflect;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName MethodAnnotation
 * @description:
 * @author: isquz
 * @time: 2020/10/20 22:11
 */
public class MethodAnnotation {

    public List<String> returnParamList(){
        List<String> list = new ArrayList<>();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        return list;
    }

    @TestMethod(params = "returnParamList")
    public void testMethodWithAnnotation(String s){
        System.out.println("获取注解传递的参数集合" + s);
    }
}

反射调用注解:

package Reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;

/**
 * @ClassName TestMethodAnnotation
 * @description:
 * @author: isquz
 * @time: 2020/10/20 22:07
 */
public class TestMethodAnnotation {
    public static void main(String[] args) {
        Class<?> cls = MethodAnnotation.class;
        Method[] methods = cls.getDeclaredMethods();
        try {
            for(Method method:methods){
                TestMethod methodInfo = method.getAnnotation(TestMethod.class);
                if(methodInfo != null){
                    System.out.println("添加注解的方法名:" + method.getName());
                    String param = methodInfo.params();
                    Class<?>[] methodParamType = method.getParameterTypes();
                    String variable = methodParamType[0].getSimpleName();
                    System.out.println("测试方法所需参数类型:" + variable);
                    System.out.println("注解中参数来源方法:" + param);

                    Method paramMethod = cls.getDeclaredMethod(param);
                    Method testMethod = cls.getDeclaredMethod(method.getName(), variable.getClass());

                    Iterable<?> paramList = (Iterable<?>) paramMethod.invoke(cls.newInstance());
                    Iterator<?> iterator = paramList.iterator();
                    while (iterator.hasNext()){
                        testMethod.invoke(cls.newInstance(), iterator.next());
                    }
                }
            }
        }catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }
}

相关文章

  • 反射 注解 应用

    今天才知道Java的反射这么强大,可以完全不知道方法名、参数、返回值就能进行方法调用,而且还能拿到方法的返回值,遍...

  • 反射和注解的应用

    反射和注解的应用 一、利用Properties读取配置文件,再用反射进行获得类的方法调用 二、利用注解来简化读取配...

  • 大连滕泰科技学习笔记2020-06-18

    1,反射作业 1,1 自定义注解和反射的应用需求1:模拟junit测试框架有注解(方法上有)告诉我一个方法名称,(...

  • 注解,反射的简单应用

    java的注解和反射学了一直没有用到,主要是框架帮我们封装好了,那就好了,仿写框架就可以开拓新思路仿mybatis...

  • 一文搞懂反射泛型和反射注解以及通过注解方式写一个BaseDao

    反射泛型和反射注解概括起来就三步: 自定义注解 通过反射获取注解值 使用自定义注解 最终案例 通过自定义注解,将数...

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • 从Java到Kotlin(七)

    反射和注解 目录 1.反射1.1类引用1.2函数引用1.3属性引用 2.注解2.1声明注解2.2构造函数 1.反射...

  • 注解Annotation--java26(02/19/2016)

    主要内容 JDK内置的基本注解类型(3个)自定义注解类型对注解进行注解(4个)利用反射获取注解信息(在反射部分涉及...

  • 注解和反射

    注解和反射

  • 通过自定义注解实现工厂模式

    本次介绍自定义编译时注解,编译时注解,不会在影响应用的打包,没有性能问题。如果是运行时注解,通过反射调用,就会有性...

网友评论

      本文标题:反射 注解 应用

      本文链接:https://www.haomeiwen.com/subject/zqejmktx.html