反射基础学习可以参考我之前写的一篇文章:
https://blog.youkuaiyun.com/SELECT_BIN/article/details/80620739
先说下业务背景:
要执行方法的类名/路径和方法名都以动态的形式传
这个时候第一个想到的是Java的反射,于是写了一下:
这个时候突然发现用jdk反射获取对象的形式和new的对象性质一样的,
也就是说Spring的Autowired不生效了,
这时候想到Spring的ApplicationContextAware,现在Spring boot
加载maven配置:
<dependency>
<groupId>com.csc.permission</groupId>
<artifactId>permission-sec-cert-client</artifactId>
<version>1.0.7-SNAPSHOT</version>
</dependency>
实例:
普通反射:
package com.unicom.kc.task.job.service.impl;
import com.unicom.kc.task.job.service.TaskJobCompensateService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.lang.reflect.Method;
/**
* @version 1.0
* @ClassName TaskJobCompensateServiceImlp
* @Description ***************
* @Author 74981
* @Date 2019/4/15 11:01
*/
@Service
public class TaskJobCompensateServiceImlp implements TaskJobCompensateService {
private static final Log logger = LogFactory.getLog(TaskJobCompensateServiceImlp.class);
@Override
public void reflectCompensate(String className, String methodName){
Class<?> demo = null;
logger.info("入参:className=" + className + ";methodName=" + methodName);
try {
demo = Class.forName(className);
} catch (Exception e) {
logger.error("获取执行Class失败!");
e.printStackTrace();
}
if (null == demo){
logger.error("获取执行Class失败!");
return;
}
try{
Method method = demo.getMethod(methodName);
method.invoke(demo.newInstance());
}catch (Exception e){
logger.err