通过反射加载内部或者外部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);
    }

 

posted @ 2022-10-03 11:05  雨梦大木  阅读(66)  评论(0编辑  收藏  举报