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

  • 相关阅读:
    代码小知识之UUID
    Tomcat源码学习(3)How Tomcat works(转)
    Tomcat源码学习(3)How Tomcat works(转)
    Tomcat源码学习(6)How Tomcat works(转)
    Tomcat源码学习(5)How Tomcat works(转)
    Tomcat源码学习(2)How Tomcat works(转)
    Tomcat源码学习(5)How Tomcat works(转)
    Tomcat源码学习(2)How Tomcat works(转)
    Tomcat源码学习(6)How Tomcat works(转)
    Tomcat源码学习(4)How Tomcat works(转)
  • 原文地址:https://www.cnblogs.com/trekxu/p/12835899.html
Copyright © 2020-2023  润新知