通过反射加载内部或者外部class对象
一、class对象信息
import com.baomidou.mybatisplus.core.toolkit.StringUtils; import lombok.Data; /** * handler的配置信息 */ @Data public class HandlerConfig { /** * 处理类版本 */ private String handlerVersion; /** * 处理类类名 */ private String handlerClassName; /** * 处理类包名 */ private String handlerPackage; /** * class文件存儲地址 */ private String filePath; /** * class文件存储名称 */ private String fileName; /** * 是否从外部加载 true:从外部加载 false:本地加载 */ private boolean isInitialized = false; }
二、创建本地class读取器
import lombok.extern.slf4j.Slf4j; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * 本地class加载器 */ @Slf4j public class LocalClassLoader extends ClassLoader { /** * 读取 jar包外的 Class文件,获取到 bean * * @param fileAddress class文件绝对路径 * @param className class文件的package+类名 * @return Class<?> */ public Class<?> findClass(String fileAddress, String className) { String[] split = className.split("\\."); File file = new File(fileAddress + split[split.length - 2] + ".class"); try { FileInputStream fileInputStream = new FileInputStream(file); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); int len; while ((len = fileInputStream.read()) != -1) { byteArrayOutputStream.write(len); } byte[] data = byteArrayOutputStream.toByteArray(); fileInputStream.close(); byteArrayOutputStream.close(); String classN = className.substring(0, className.lastIndexOf(".")); return defineClass(classN, data, 0, data.length); } catch (IOException e) { log.error("读取jar包外class文件出现异常!【{}】", e.getMessage()); } return null; } }
三、创建工具类
BaseHandler做为统一的父类对象使用,可根据自己需要进行返回值修改
import com.alibaba.fastjson.JSON; import com.ft.monitoring.dataInterface.common.base.BaseHandler; import com.ft.monitoring.dataInterface.common.base.HandlerConfig; import lombok.extern.slf4j.Slf4j; /** * 通过反射创建对象 * */ @Slf4j public class ObjectContainer { /** * jar包class加载器 */ private static final ClassLoader loader = ObjectContainer.class.getClassLoader(); /** * 本地加载器 */ private static final LocalClassLoader localLoader = new LocalClassLoader(); /** * 获取基础处理类 * * @param handlerConfig handler配置类 * @return */ public static BaseHandler getBaseHandler(HandlerConfig handlerConfig) { BaseHandler baseHandler = null; if (handlerConfig.isInitialized()) { //获取本地文件路径 try { baseHandler = (BaseHandler) localLoader.findClass(handlerConfig.getFilePath(), handlerConfig.getFilePath() + "." + handlerConfig.getFileName()).newInstance(); } catch (Exception e) { log.error("加载本地class失败:" + JSON.toJSONString(handlerConfig), e.getMessage()); } } else { try { baseHandler = (BaseHandler) loader.loadClass(handlerConfig.getHandlerPackage() + "." + handlerConfig.getHandlerClassName()).newInstance(); } catch (Exception e) { log.error("加载Jar包内class失败:" + JSON.toJSONString(handlerConfig), e.getMessage()); } } return baseHandler; } }
四、使用
public void createHandler(){ HandlerConfig handlerConfig = new HandlerConfig(); //加载jar内部class handlerConfig.setHandlerPackage("cn.com.demo"); handlerConfig.setHandlerClassName("Test"); handlerConfig.setHandlerVersion("v1.0"); handlerConfig.setInitialized(false); //加载外部class handlerConfig.setFilePath("D://cn//com//demo"); handlerConfig.setFileName("Test.class"); handlerConfig.setInitialized(true); //实例化handler对象 BaseHandler baseHandler = ObjectContainer.getBaseHandler(handlerConfig); }