# lmaor-base-tools **Repository Path**: ninestarry/lmaor-base-tools ## Basic Information - **Project Name**: lmaor-base-tools - **Description**: 一堆自己写的工具类。 文件修改监听,反射工具 字节转换 热加载 字节码处理,获取class字节信息的实现 执行某jar,设定一个classpath,执行的当前路径或jar中某类的某些方法。 - **Primary Language**: Java - **License**: EPL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2018-10-26 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 基础工具包 5 读取本地的 class 信息,通过class文件的结构解析出来的ClassInfo。 ------------------------------------------------------------------------------------------------------------------- ClassFile classFile = ClassReader.read("/Test.class"); // 获得类信息 ClassInfo classInfo = ClassReader.getClassInfoByClassFile(classFile); ------------------------------------------------------------------------------------------------------------------- 模块热加载 ------------------------------------------------------------------------------------------------------------------- ModuleLoader ml = new ModuleLoaderDefaultImpl(); // 模块加载选择器, 选择加载的模块 ml.setModuleLoaderCondition((TypeCondition tc) -> { return tc.isAnnotationPresent(XXX.class); // 选择被这个注解修饰的类作为容器 }); // 加载模块 并安装到系统, 将加载路径设置为这个应用程序到默认classpath路径, 安装名称 test-md ModuleApplication app = ml.loadModule("/Users/zhangxingyu/project/testall/", "test-md"); // 获得 bean的容器 List mcs = app.getModuleContainers(); // 执行每个容器 mcs.forEach(mc->{ // 执行容器内让选择到方法, 选择 main 函数 List mes = mc.getMethods((ttype,mmethod,mcc) -> mmethod.getName().equals("main")); // 执行 bean 的方法 mes.forEach(me -> { System.out.println("执行到方法 = "+me.getName()); DynamicExecute dexec = new DynamicExecute(); try { // 简单设置全局默认参数 (自定义规范设置参数,使用参数模版 ExecParamTemplate) dexec.put(String[].class, new String[]{"xx"}); dexec.invoke(mc.getInstance(), me); } catch (Throwable e) { e.printStackTrace(); } }); }); ------------------------------------------------------------------------------------------------------------------- 文件扫描 扫描文件所有内容,如果类文件则封装.class文件信息,遇到jar则解压,可以通过ScanFileInputstream 获取数据 ------------------------------------------------------------------------------------------------------------------- List files = DirAndJarScanFileFactory.scan("/Users/zhangxingyu/project/testall/"); files.forEach(file -> { if(file.getClassName() != null) { 是class文件 可以获得这个类的 注解 接口等定义。这个类再这里没有被加载,通过自定义class解析实现 } }); ------------------------------------------------------------------------------------------------------------------- 反射工具 ------------------------------------------------------------------------------------------------------------------- FieldUtils MethodUtils ClassUtils ------------------------------------------------------------------------------------------------------------------- 动态执行, 执行的参数是任意长度. ------------------------------------------------------------------------------------------------------------------- DynamicExecute dexec = new DynamicExecute(execParamTemplate); // execParamTemplate 自定义每个参数模版填充模式 dexec.put(type, value); // 普通的参数填充 dexec.put(type, value); Object result = dexec.invoke(obj, method); ------------------------------------------------------------------------------------------------------------------- 其他工具 SBitUtils 字节类型转换,大端小端 (此方法另一个git工程copy过来,(原工程自实现 java -> c结构体内存序列化 )) git地址: []