精华内容
下载资源
问答
  • php 反射 依赖注入

    2017-05-04 15:29:22
    php 反射 依赖注入
    <?php
     
      if (PHP_SAPI != 'cli') {
      exit('Please run it in terminal!');
      }
      if ($argc < 3) {
      exit('At least 2 arguments needed!');
      }
     
      $controller = ucfirst($argv[1]) . 'Controller';
      $action = 'action' . ucfirst($argv[2]);
     
      // 检查类是否存在
      if (!class_exists($controller)) {
      exit("Class $controller does not existed!");
      }
     
      // 获取类的反射
      $reflector = new ReflectionClass($controller);
      // 检查方法是否存在
      if (!$reflector->hasMethod($action)) {
      exit("Method $action does not existed!");
      }
     
      // 取类的构造函数
      $constructor = $reflector->getConstructor();
      // 取构造函数的参数
      $parameters = $constructor->getParameters();
      // 遍历参数
      foreach ($parameters as $key => $parameter) {
      // 获取参数声明的类
      $injector = new ReflectionClass($parameter->getClass()->name);
      // 实例化参数声明类并填入参数列表
      $parameters[$key] = $injector->newInstance();
      }
     
      // 使用参数列表实例 controller 类
      $instance = $reflector->newInstanceArgs($parameters);
      // 执行
      $instance->$action();
     
      class HelloController
      {
      private $model;
     
      public function __construct(TestModel $model)
      {
      $this->model = $model;
      }
     
      public function actionWorld()
      {
      echo $this->model->property, PHP_EOL;
      }
      }
     
      class TestModel
      {
      public $property = 'property';
      }
    展开全文
  • 因为我们是手动通过反射获得的Bean的实例,这种方式相当于我们new Bean(),此Bean的实例已完全脱离Spring容器,所以Spirng无法感知它的存在,所以调用类中的依赖注入类和AOP会失效解决方法:以下均为局部核心代码,...

    因为我们是手动通过反射获得的Bean的实例,这种方式相当于我们new Bean(),此Bean的实例已完全脱离Spring容器,所以Spirng无法感知它的存在,所以调用类中的依赖注入类和AOP会失效

    解决方法:以下均为局部核心代码,需要根据自己场景相应调整

    1:

    WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();

    Class clazz = wac.getBean("XService").getClass();

    Method method = clazz.getDeclaredMethod(methodName);

    method.invoke(wac.getBean("XService"));

    2:

    @Autowired

    private ApplicationContext applicationContext;

    Class> serviceClazz = Class.forName(serviceName);

    Class> paramClazz = Class.forName(paramName);

    Method method = serviceClazz.getMethod(methodName, paramClazz);

    method.invoke(applicationContext.getBean(serviceClazz), paramObj);

    3:多参数反射

    Class> serviceClazz = Class.forName(serviceName);

    ListparamList = new ArrayList<>();

    List> paramClazzList = new ArrayList<>();

    for (Object o : params) {

    Class> paramClazz = o.getClass();

    paramList.add(o);

    paramClazzList.add(paramClazz);

    }

    Method method = serviceClazz.getMethod(methodName, paramClazzList.toArray(new Class>[]{}));

    method.invoke(applicationContext.getBean(serviceClazz), paramList.toArray());

    展开全文
  • 本文主要讲解反射机制的实现和反射机制在优秀框架中的使用1.反射机制的实现:在聊java反射之前,先看一段代码:public class Student {private String name;public void println(){System.out.println(name);}}这是...

    本文主要讲解反射机制的实现和反射机制在优秀框架中的使用

    1.反射机制的实现:

    在聊java反射之前,先看一段代码:

    public class Student {

    private String name;

    public void println(){

    System.out.println(name);

    }

    }

    这是一个Student类,定义了一个私有name属性,一个打印方法,没有get和set方法,现在如果我想掉用Student的println方法,能否给name赋值?

    为了解决这个问题,java设计了反射机制。

    何为反射机制?

    先看一段代码:

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Student stu = new Student();

    try {

    Field f = stu.getClass().getDeclaredField("name");//获取Student的name属性

    f.setAccessible(true);//允许反射使用该字段

    f.set(stu, "张三");//设置值

    stu.println();

    } catch (NoSuchFieldException | SecurityException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IllegalArgumentException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    上面就是一段简单的java反射实现,通过field获取Student的name属性,然后过反射访问该字段,实现给该字段赋值。

    执行步骤:

    1.获取field对象

    2.修改field对象属性为private时可修改

    3.给对象的属性赋值

    通过运行main方法,能够打印张三

    在了解何为反射之后,我们将这段代码进行改造:

    public class Reflex {

    public static void setter(Object obj,String field,Object value){

    try {

    Field f = obj.getClass().getDeclaredField(field);

    f.setAccessible(true);

    f.set(obj, value);

    } catch (NoSuchFieldException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (SecurityException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IllegalArgumentException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    public static void main(String[] args) {

    Student stu=new Student();

    Reflex.setter(stu, "name", "张三");

    stu.println();

    }

    }

    改造之后的代码,实现了面向对象的设计,解释一下传入的三个参数:

    Object obj:需要反射的具体的对象(就是告诉我给哪个学生赋值)

    String field:需要实现反射的属性(就是告诉我需要给学生的赋值的是哪个属性)

    Object value:需要实现反射的属性值(就是告诉我需要给学生的赋什么值)

    2.ORM主要实现(基于Mybatis)

    谈完反射,来谈谈ORM:

    所谓ORM(对象关系映射):就是把数据库的字段变成java实体类的属性

    我们看一个配置:

    这个配置就是将从数据库获取的字段与实体类的字段一一对应。

    具体解释一下,这段配置,有哪些信息

    类名

    类中属性名

    对应的数据库中数据的字段名

    有了这三个信息,我就可以模拟实现了,来看Mybatis的实现

    public static void copyBeanProperties(Class> type, Object sourceBean, Object destinationBean) {

    Class> parent = type;

    while (parent != null) {

    final Field[] fields = parent.getDeclaredFields();

    for(Field field : fields) {

    try {

    field.setAccessible(true);

    field.set(destinationBean, field.get(sourceBean));

    } catch (Exception e) {

    // Nothing useful to do, will only fail on final fields, which will be ignored.

    }

    }

    parent = parent.getSuperclass();

    }

    }

    来看看怎么调用的

    public static Object createProxy(Object target, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, List> constructorArgTypes, ListconstructorArgs) {

    final Class> type = target.getClass();

    EnhancedResultObjectProxyImpl callback = new EnhancedResultObjectProxyImpl(type, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);

    Object enhanced = crateProxy(type, callback, constructorArgTypes, constructorArgs);

    PropertyCopier.copyBeanProperties(type, target, enhanced);

    return enhanced;

    }

    通过注入的方式实现从List到List,就是说,将Object通过复制,转换成我们需要的具体的实现类。

    3.依赖注入的实现

    何谓依赖注入?

    创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

    简单来说,就是实例化对象不由开发者new去实例化,而是交给Spring 容器去实例化(详细的依赖注入的优点和缺点这里不做详细解释)。

    我们来看看Spring的依赖注入怎么利用反射的。

    a2af288bcab60603ae3b7fe138ea5522.png

    这个是Autowired的具体实现,主要就是通过反射的方式实现。

    当然,在实现注入之前,实现了判断缓存、判空等。

    总结:

    java的反射机制是众多优秀框架的核心实现之一,优点是,在不需要实现get和set方法的的前提下,赋值或实例化对象,降低代码之间的耦合。

    展开全文
  • 或者通过反射来创建对象,然后调用目标类的方法时,此时目标类如果也依赖注入了其他的bean。那么此时所有的bean都会脱离spring容器的管理。我们的方法中就会报错【java.lang.NullPointerException】那么我们改如何...

    ## 事件原因:

    - 估计很多人会忽略,当我们在使用 spring管理bean时,如果我们使用new Object();

    或者通过反射来创建对象,然后调用目标类的方法时,此时目标类如果也依赖注入了其他的bean。

    那么此时所有的bean都会脱离spring容器的管理。我们的方法中就会报错

    【java.lang.NullPointerException】

    那么我们改如何解决这个问题呢?如何在使用反射机制的同时,也要用spring的bean呢?

    看下文:

    @Component

    public class RobotOrder {

    @Autowired

    private DirectiveController directiveController;

    public static RobotOrder robotOrder;

    /**

    * 初始化

    * 由于该类的方法被某些类通过反射调用时,脱离了spring容器的管理,导致本类注入的对象失败

    * 此操作就是从新初始化并获取注入的对象。

    * 所有的注入的对象都通过 本对象来调用

    * 例:robotOrder.directiveController

    * jbmei

    * 2020/3/7 12:50

    */

    @PostConstruct

    public void init(){

    robotOrder=this;

    }

    }

    ### 贴一段 反射调用的代码

    String classPath="类路径";

    String methodName ="方法名";

    try {

    Class clazz=Class.forName(classPath);

    Method method= clazz.getDeclaredMethod(methodName,cq.getClass(),event.getClass().getSuperclass());

    log.info(classPath+"."+methodName+"方法开始执行");

    result= (int) method.invoke(clazz.newInstance(),参数列表);

    } catch (Exception e) {

    log.error(classPath+"."+methodName+"方法出现异常:"+e.getCause());

    }finally {

    log.info(classPath+"."+methodName+"方法执行结束");

    }

    展开全文
  • php反射依赖注入

    2018-07-13 09:59:18
    * @return array */ protected static function getMethodParam($className, $methodsName = '__construct') { // 通过反射获得该类 $class = new ReflectionClass($className); ...
  • 该项目是基于SpringBoot框架的Maven项目。 今天在拦截器中处理拦截逻辑时需要使用注解调用... 本文标题: SpringBoot的拦截器中依赖注入为null的解决方法 本文地址: http://www.cppcns.com/ruanjian/java/231396.html
  • C# 反射依赖注入

    2021-02-15 01:44:25
    反射依赖注入1.1 接口隔离原则1.1.11.1.21.1.3 显示接口实现2. 反射2.1 反射应用 1. 反射依赖注入 反射:以不变应万变(更松的耦合) 反射与接口的结合 反射与特性的结合 依赖注入:此DI非彼DI,但没有彼DI...
  • 主要介绍了JavaScript反射依赖注入,结合实例形式较为详细的分析了JavaScript反射依赖注入的概念、原理、定义、使用方法及相关操作注意事项,需要的朋友可以参考下
  • 反射依赖注入DEMO

    2015-07-10 11:08:37
    最近在熟悉反射依赖注入,特意写了一下简单的实例,希望可以帮助到你我他
  • PHP反射依赖注入

    2021-01-20 14:02:46
    PHP类的反射依赖注入 在讲服务容器之前我想先梳理下PHP反射相关的知识,PHP反射是程序实现依赖注入的基础,也是Laravel的服务容器实现服务解析的基础,如果你已经掌握了这方面基础知识,那么可以跳过本文直接看...
  • 先解释什么是依赖注入依赖注入能解决什么问题requirejs中的依赖注入angular中反射方法的依赖注入好处就是依赖的顺序可以打乱。Injector Demo打开开发者工具,在控制台查看效果var Injector = function(){this._...
  • 我试图理解我是否可以将反射与弹簧依赖注入相结合,如下所示:public interface ClientCommand {public void execute(...);public static enum Command {SomeCommand(SomeCommand.class);private Class extends ...
  • PHP具有完整的反射 API,提供了对类、接口、函数、方法和扩展进行逆向工程的能力。通过类的反射提供的能力我们能够知道类是如何被定义的,它有什么...本文主要是讲解如何利用类的反射来实现依赖注入(Dependency Inj...
  • 主要介绍了php反射学习之依赖注入,结合具体实例形式分析了php基于反射依赖注入原理与实现方法,需要的朋友可以参考下
  • PHP具有完整的反射 API,提供了对类、接口、函数、方法和扩展进行逆向工程的能力。通过类的反射提供的能力我们能够知道类是如何被定义的,它有什么... 本文主要是讲解如何利用类的反射来实现依赖注入(Dependency In...
  • 但是写了两三天,其中不少地方删删改改,最后勉强实现了spring中的核心功能:依赖注入我本身用过spring和guice这两种依赖注入框架,spring很强大,没错,但是spring一个让人诟病的地方就是繁杂的配置,几百行的配置...
  • Spring框架核心之一便是依赖注入依赖注入主要实现是通过java反射,他是如何工作以及要得到的目的是什么,可以通过以下代码实战可以了解到。 如果你像了解依赖注入的详细概念可以参考以下博客...
  • 依赖注入又叫控制反转,使用过框架的人应该都不陌生。很多人一看名字就觉得是非常高大上的东西,就对它望而却步,今天解开他它的神秘面纱。废话不多说,直接上代码;/**** 工具类,使用该类来实现自动依赖注入。**/...
  • Spring中有几种依赖注入的方式?这是一个面试高频题,但是我在面程序员的时候,听过很多种答案。那么标准答案是什么?我们先不说,一步步来分析。什么是依赖注入首先,我们得知道什么是依赖注入?就是填充属性。一个...
  • spring的一大核心概念是注入,但是,这存在的一个前提就是类是由spring管理起来的。反射是根据className生成一个具体的实例,这是一个很实用的思想。比如:当我们需要根据传进来的参数的类型,选择具体的实现类时,...
  • .NET 反射依赖注入

    2013-01-28 16:42:00
    .NET 反射依赖注入 接口反射: 接口层:接口(interface) 定义为DAL层 接口(interface) Idal 使用反射技术(Reflection) 对Idal 使用工厂模式创建出锁需要的接口实例 例子:  string path = "DAL"; private...
  • //value是Annotation的默认属性 } 五、反射注入工具类编写 package cn.com.songjy.annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ...
  • 依赖注入概述使用过Angular的读者一定对依赖注入不陌生。从Angular.js到Angular,依赖注入都是绕不开的话题。在其他语言或者框架下,依赖注入也广泛应用,比如JAVA/SCALA使用Guice,C#使用Ninject。什么是依赖注入?...
  • 反射机制正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之.反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法.审查元数据并收集关于它的类型信息的能力。元数据(编译以后...
  • 反射和DI依赖注入

    2020-05-05 19:55:22
    反射和DI依赖注入 IOC 让程序员不再关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给spring容器来做。 一、反射 反射就是把java类中的各种成分映射成一个个的Java对象。 ...
  • 类的反射依赖注入

    2018-05-21 10:48:21
    在讲服务容器之前我想先梳理下PHP反射相关的知识,PHP反射是程序实现依赖注入的基础,也是Laravel的服务容器实现服务解析的基础,如果你已经掌握了这方面基础知识,那么可以跳过本文直接看服务容器部分的内容。...
  • 本文参考博客(https://blog.csdn.net/dream_successor/article/details/79078905, ... 前一篇简单理解了PHP依赖注入,在实际开发过程中,我们并不知道依赖的类将来会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,882
精华内容 752
关键字:

反射依赖注入