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调用器也非常简单,就是对一个域的设置工作.

  • 相关阅读:
    cpu gpu数据同步
    metal &object c
    unity macro 分平台处理
    unity reflection probe --- forward deferred transparent opaque
    unity pbr
    unity 实时间接光照 解决方案
    Gpu driven rendering pipelines & bindless texture
    在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
    转自大楚网:微软SAPI:让你的软件能说会道
    (转) 使用Speech SDK 5.1文字转音频
  • 原文地址:https://www.cnblogs.com/trekxu/p/12835899.html
Copyright © 2011-2022 走看看