zoukankan      html  css  js  c++  java
  • 002 Invoker调用器

    方法调用器 : 

    public interface Invoker {
      Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;
    
      Class<?> getType();
    }
    

      在框架的内容,使用这个对象完成方法的调用,我们看看Invoker的直接定义.

    [1] 给定指定的对象和参数,进行方法调用,最终得到计算的结果.

    [2]获取类型,也就是这个Invoker的实际类型.

    在框架的内容,封装了常见的三个调用器.

    分别是set调用器,get调用器,一般方法调用器.

    我们首先看一般方法调用器.

    public class MethodInvoker implements Invoker {
    
      private final Class<?> type;
      private final Method method;
    
      public MethodInvoker(Method method) {
        this.method = method;
    
        if (method.getParameterTypes().length == 1) {
          type = method.getParameterTypes()[0];
        } else {
          type = method.getReturnType();
        }
      }
    
      @Override
      public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException {
        try {
          return method.invoke(target, args);
        } catch (IllegalAccessException e) {
          if (Reflector.canControlMemberAccessible()) {
            method.setAccessible(true);
            return method.invoke(target, args);
          } else {
            throw e;
          }
        }
      }
    
      @Override
      public Class<?> getType() {
        return type;
      }
    }
    

      通过上面的代码,我们可以直接看到对应的方法调用的过程,就是封装了一般的方法调用,在这里,我们看到getType的定义,现在是非常模糊的,不知道到底是干什么用的.

    public class GetFieldInvoker implements Invoker {
      private final Field field;
    
      public GetFieldInvoker(Field field) {
        this.field = field;
      }
    
      @Override
      public Object invoke(Object target, Object[] args) throws IllegalAccessException {
        try {
          return field.get(target);
        } catch (IllegalAccessException e) {
          if (Reflector.canControlMemberAccessible()) {
            field.setAccessible(true);
            return field.get(target);
          } else {
            throw e;
          }
        }
      }
    
      @Override
      public Class<?> getType() {
        return field.getType();
      }
    }
    

      get调用器也是非常简单的,我们可以通过get调用器获取到对应的域的真实值.

    public class SetFieldInvoker implements Invoker {
      private final Field field;
    
      public SetFieldInvoker(Field field) {
        this.field = field;
      }
    
      @Override
      public Object invoke(Object target, Object[] args) throws IllegalAccessException {
        try {
          field.set(target, args[0]);
        } catch (IllegalAccessException e) {
          if (Reflector.canControlMemberAccessible()) {
            field.setAccessible(true);
            field.set(target, args[0]);
          } else {
            throw e;
          }
        }
        return null;
      }
    
      @Override
      public Class<?> getType() {
        return field.getType();
      }
    }
    

      set调用器也非常简单,就是对一个域的设置工作.

  • 相关阅读:
    Angular Universal 学习笔记
    SAP Spartacus 如何获得当前渲染页面的 CMS 元数据
    Angular 服务器端渲染的学习笔记(二)
    Angular 服务器端渲染的学习笔记(一)
    第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
    如何从 SAP Spartacus Product Detail 页面,找到其 Angular 实现 Component 的位置
    具备自动刷新功能的 SAP ABAP ALV 报表
    C++学习目录
    c--条件编译
    c--文件读写--二进制
  • 原文地址:https://www.cnblogs.com/trekxu/p/12835899.html
Copyright © 2011-2022 走看看