ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

一个java实现代码(服务)编排的思路(未完)

2021-02-22 18:33:19  阅读:300  来源: 互联网

标签:java String 代码 public 编排 static return clazz class


创建模板java文件

使用freemaker创建一个java代码运行的模板,整体设计类似于模板方法设计模式,在模板内规定了程序运行的主体步骤,细节实现放在模板中的key中

前端配置模块

每个模块的背后都是一段提前写好的代码,这段代码是可以嵌入到之前准备好的模板的

用户通过拖拽模块来实现自己的逻辑

用户拖拽好模块并保存,后端基于模板及用户的配置信息,生成java文件

编译java文件

编辑java文件,加载相关的类,加入到spring容器中

后端提前准备好一个通用接口

这个接口的核心逻辑就是根据不同的java类名来调用spring容器中的类来完成逻辑。

已经写的demo类

@RestController
public class TestController {


    @Autowired
    private UserService userService;

    @GetMapping("/test")
    public String test01() throws Exception {
        String hello = userService.sayHello("hello");
        return hello;
    }
}
@Service
public class UserService {

    public String sayHello(String name) throws Exception {
        ReflectObj reflectObj = LoadClassUtil.map.get(name);
        return reflectObj.invoke();
    }
}
public class LoadClassUtil {


    public static Map<String, ReflectObj> map = new HashMap<>();
    static {
        try {
            loadClass("com.example.javasou.Hello");
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    //加载class对象
    public static void loadClass(String className) throws Exception {
        javac("E:\\learn\\java\\Hello.java");
        Thread.sleep(2000);
        MyClassLoader myClassLoader = new MyClassLoader();
        myClassLoader.setClassPath("E:\\learn\\java\\Hello.class");
        Class clazz = myClassLoader.loadClass(className);
        DynamicLoadUtils.addBean(clazz,"hello111",SpringContextUtil.getApplicationContext());
        Object obj = clazz.newInstance();
        map.put("hello",new ReflectObj(clazz, obj));
    }

    public static void javac(String packageAndClass) throws IOException {
        Runtime.getRuntime().exec("javac  " + packageAndClass);
    }
}
public class MyClassLoader extends ClassLoader {
    //需要加载类的路径
    private String classPath;

    public MyClassLoader() {
    }

    public MyClassLoader(String classPath) {
        super();
        this.classPath = classPath;
    }
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        Class<?> clazz = null;
        // 获取class文件字节码数组
        byte[] clazzByteArr = getData();

        if (clazzByteArr != null) {
            // 将class的字节码数组转换成class类的实例
            clazz = defineClass(name, clazzByteArr, 0, clazzByteArr.length);
        }
        return clazz;
    }

    private byte[] getData() {
        File file = new File(this.classPath);
        if (file.exists()) {
            FileInputStream in = null;
            ByteArrayOutputStream out = null;
            try {
                in = new FileInputStream(file);
                out = new ByteArrayOutputStream();

                byte[] buffer = new byte[1024];
                int size = 0;
                while ((size = in.read(buffer)) != -1) {
                    out.write(buffer, 0, size);
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return out.toByteArray();
        } else {
            return null;
        }
    }
    public String getClassPath() {
        return classPath;
    }
    public void setClassPath(String classPath) {
        this.classPath = classPath;
    }
}
public class ReflectObj {

    public ReflectObj(Class aClass, Object object) {
        this.aClass = aClass;
        this.object = object;
    }

    private Class aClass;
    private Object object;

    public String invoke() throws Exception {
        Method method = aClass.getMethod("sayHello", String.class);
        return (String) method.invoke(object, "123");
    }
}
@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

}
public class DynamicLoadUtils {
    
    public static void registerController(String controllerBeanName) throws Exception {
        final RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping)
                SpringContextUtil.getBean("requestMappingHandlerMapping");

        if (requestMappingHandlerMapping != null) {
            String handler = controllerBeanName;
            Object controller = SpringContextUtil.getBean(handler);
            if (controller == null) {
                return;
            }
            unregisterController(controllerBeanName);
            //注册Controller
            Method method = requestMappingHandlerMapping.getClass().getSuperclass().getSuperclass().
                    getDeclaredMethod("detectHandlerMethods", Object.class);
            method.setAccessible(true);
            method.invoke(requestMappingHandlerMapping, handler);
        }
    }

    public static void unregisterController(String controllerBeanName) {
        final RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping)
                SpringContextUtil.getBean("requestMappingHandlerMapping");
        if (requestMappingHandlerMapping != null) {
            String handler = controllerBeanName;
            Object controller = SpringContextUtil.getBean(handler);
            if (controller == null) {
                return;
            }
            final Class<?> targetClass = controller.getClass();
            ReflectionUtils.doWithMethods(targetClass, new ReflectionUtils.MethodCallback() {
                @Override
                public void doWith(Method method) {
                    Method specificMethod = ClassUtils.getMostSpecificMethod(method, targetClass);
                    try {
                        Method createMappingMethod = RequestMappingHandlerMapping.class.
                                getDeclaredMethod("getMappingForMethod", Method.class, Class.class);
                        createMappingMethod.setAccessible(true);
                        RequestMappingInfo requestMappingInfo = (RequestMappingInfo)
                                createMappingMethod.invoke(requestMappingHandlerMapping, specificMethod, targetClass);
                        if (requestMappingInfo != null) {
                            requestMappingHandlerMapping.unregisterMapping(requestMappingInfo);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }, ReflectionUtils.USER_DECLARED_METHODS);
        }
    }

    public static void addBean(String className, String serviceName, ApplicationContext app) {
        try {
            Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
            registerBean(serviceName, beanDefinitionBuilder.getRawBeanDefinition(), app);
        } catch (ClassNotFoundException e) {
            System.out.println(className + ",主动注册失败.");
        }
    }

    public static void addBean(Class clazz, String serviceName, ApplicationContext app) {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
        registerBean(serviceName, beanDefinitionBuilder.getRawBeanDefinition(), app);
    }

    private static void registerBean(String beanName, BeanDefinition beanDefinition, ApplicationContext context) {
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) context;
        BeanDefinitionRegistry beanDefinitonRegistry = (BeanDefinitionRegistry) configurableApplicationContext
                .getBeanFactory();
        beanDefinitonRegistry.registerBeanDefinition(beanName, beanDefinition);
    }

}

标签:java,String,代码,public,编排,static,return,clazz,class
来源: https://www.cnblogs.com/hhhshct/p/14393794.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有