日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

發(fā)布時間:2023/12/19 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 一个java实现代码(服务)编排的思路(未完) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

創(chuàng)建模板java文件

使用freemaker創(chuàng)建一個java代碼運行的模板,整體設(shè)計類似于模板方法設(shè)計模式,在模板內(nèi)規(guī)定了程序運行的主體步驟,細(xì)節(jié)實現(xiàn)放在模板中的key中

前端配置模塊

每個模塊的背后都是一段提前寫好的代碼,這段代碼是可以嵌入到之前準(zhǔn)備好的模板的

用戶通過拖拽模塊來實現(xiàn)自己的邏輯

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

編譯java文件

編輯java文件,加載相關(guān)的類,加入到spring容器中

后端提前準(zhǔn)備好一個通用接口

這個接口的核心邏輯就是根據(jù)不同的java類名來調(diào)用spring容器中的類來完成邏輯。

已經(jīng)寫的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文件字節(jié)碼數(shù)組
        byte[] clazzByteArr = getData();

        if (clazzByteArr != null) {
            // 將class的字節(jié)碼數(shù)組轉(zhuǎn)換成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);
    }

}

總結(jié)

以上是生活随笔為你收集整理的一个java实现代码(服务)编排的思路(未完)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。