美文网首页
Java使用invoke反射调用方法导致@Value、@Auto

Java使用invoke反射调用方法导致@Value、@Auto

作者: 远方_2019 | 来源:发表于2020-05-08 11:19 被阅读0次

发生背景:开发过程中使用到invoke进行反射调用serviceImpl实现类的方法,在运行中发现采用反射方式调用会导致实现类中@value以及@Autowired注解失效,对应注解值都为null。

原因:因为在调用invoke反射方法时,Class是直接使用newInstance静态方法来实例化对象。所导致对应@value、@Autowired等注解失效。

PS:Spring的注解是在Spring实例化的时候扫描注入,当Spring实例化完毕之后如果再去newInstance一个新的对象显然是不受Spring管理了,所以相应的注解都是注入为null。

Class baseService = serviceClassMap.get(taskRecord.getPlateform());

// 获取指定Method方法

String methodStr = CommonMethodEnum.hasMethod(taskRecord.getType());

Method method = baseService.getMethod(methodStr,Long.class,File.class); method.invoke(baseService.newInstance(), taskRecord.getId(), file);


解决方案:使用SpringContext上下文获取对应Bean,从而避免注解失效。

method.invoke(SpringUtil.getBean(baseService), taskRecord.getId(), file);


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~SpringUtil工具类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

采用实现接口ApplicationContextAware从而获取ApplicationContext

说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext对象注入。

public class SpringContextUtil implements ApplicationContextAware

{

// Spring应用上下文环境

private static ApplicationContext applicationContext;

/** * 实现ApplicationContextAware接口的回调方法。设置上下文环境

*

* @param applicationContext

*/

public void setApplicationContext(ApplicationContext applicationContext) {

SpringContextUtil.applicationContext = applicationContext;

}

/** *

@return ApplicationContext

*/

public static ApplicationContext getApplicationContext() {

return applicationContext;

}

/** * 通过name获取对象

*  @param name

* @return Object

* @throws BeansException

*/

public static Object getBean(String name) throws BeansException {

return applicationContext.getBean(name);

}

/** * 通过class获取对象

*@param class

* @return T

* @throws BeansException

*/

public static <T> T getBean(Class<T> clazz) throws BeansException {

return applicationContext.getBean(clazz);

}

}

相关文章

  • Java使用invoke反射调用方法导致@Value、@Auto

    发生背景:开发过程中使用到invoke进行反射调用serviceImpl实现类的方法,在运行中发现采用反射方式调用...

  • Java动态代理

    java动态代理 先看Method反射,调用getDeclaredMethod查找方法;invoke执行方法,返回...

  • 【Java 进阶】Java 反射

    反射:获取Class中所有字段(Field)与方法(Method),并实现调用(invoke) Java 反射简单...

  • JVM的反射调用实现

    如何执行反射调用 Java的反射调用是通过java.lang.reflect.Method的invoke调用执行,...

  • 9012年了,别说java反射慢了

    java 反射 java反射 调用 通过Method.invoke 委托给sun.reflect.MethodAc...

  • java反射invoke动态调用方法

    @Autowired标签自动注入TestMapper失败,可能出现的空指针报错: java.lang.NullPo...

  • Java高级知识

    反射 sczyh30 深入解析Java反射(1) - 基础深入解析Java反射(2) - invoke方法深入探究...

  • Java7新特性9-方法句柄

    方法句柄-现代化的反射 java7中为间接调用方法引入了新的api,其中最关键的是java.lang.invoke...

  • 10.3 UiPath如何调用Java

    调用Java方法(Invoke Java Method)的介绍从Java Scope中的.jar加载的方法中调用指...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

网友评论

      本文标题:Java使用invoke反射调用方法导致@Value、@Auto

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