Java 基於上傳的jar進行反射生成物件
最近專案上有個新需求,使用者上傳的jar包,然後解析jar包中指定的類的指定方法的請求引數和返回引數,這裡做一個簡單的記錄,以後可以基於這個demo進行擴充套件
建立一個SpringBoot 的web專案,專案整合了swagger 和 lombok
controller編寫:
controller 很簡單 主要是實現檔案的上傳
@RestController @RequestMapping("/upload") @Api(tags = "FileUploadController") public class FileUploadController { private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class); @Value("${mvp.fileupload.path}") private String filepath; @Autowired private ParamParseService paramParseService; @PostMapping(value = "") @ApiOperation(value = "上傳文件", notes="上傳jar並解析") public String upload(@RequestParam(value = "file") MultipartFile file, @RequestParam String service, @RequestParam String method)throws Exception{ byte[] bytes = file.getBytes(); ParamParseDTO paramParseDTO = new ParamParseDTOBuilder().jar(bytes) .jarName(file.getOriginalFilename()).path(filepath) .service(service).method(method).build(); paramParseService.parseJar(paramParseDTO); logger.info("解析成功!"); return "parse success"; } }
編寫service層程式碼,這個功能的核心邏輯都在service方法中
@Service public class ParamParseService { public void parseJar(ParamParseDTO paramParseDTO) { // 1 將上傳的jar檔案儲存到本地 File file = new File(getWorkspacePath(paramParseDTO.getPath()),paramParseDTO.getJarName()); try(FileOutputStream outputStream = new FileOutputStream(file)){ outputStream.write(paramParseDTO.getJar()); }catch (Exception e){ e.printStackTrace(); } // 現場保護 ClassLoader current = Thread.currentThread().getContextClassLoader(); try { // 2 獲取本地檔案的classLoader ClassLoader jarClassLoader = getClassLoader(new File[] {file}); // 3 進行反射解析 Thread.currentThread().setContextClassLoader(jarClassLoader); // 4 使用指定的類載入器 獲取上傳jar包中的指定類的class物件 Class<?> aClass = Class.forName(paramParseDTO.getService(), true,Thread.currentThread().getContextClassLoader()); Object obj = aClass.newInstance(); System.out.println(obj.hashCode()); }catch (Exception e){ e.printStackTrace(); } // 恢復現場 Thread.currentThread().setContextClassLoader(current); } public static String getWorkspacePath(String path) { File dir = new File(System.getProperty("user.dir"), "automation"+File.separator+path); try { FileUtils.forceMkdir(dir); } catch (Exception e) { throw new RuntimeException(e); } return dir.getAbsolutePath(); } public ClassLoader getClassLoader(File[] jars) throws IOException { ArrayList<URL> classpath = new ArrayList<>(); if (jars != null && jars.length > 0) { for (File jar : jars) { classpath.add(jar.toURI().toURL()); } } return new URLClassLoader(classpath.toArray(new URL[0]), Thread.currentThread().getContextClassLoader()); } }
這篇文字只是記錄了主要的流程,至於業務就是在這個基礎上進行擴充套件的
參考連結:
https://shixin.blog.csdn.net/article/details/54604224
相關文章
- Java中的反射機制(二) 一個利用反射進行物件拷貝的例子Java反射物件
- java 生成可執行jar包JavaJAR
- java-maven生成可執行的 jar 包JavaMavenJAR
- java之生成jar包JavaJAR
- 基於socket的上傳下載(Java)精簡版Java
- koa2基於stream(流)進行檔案上傳和下載
- java反射構建物件和方法的反射呼叫Java反射物件
- 微信小程式基於騰訊雲物件儲存的圖片上傳微信小程式物件
- 使用原生Java程式碼生成可執行Jar包JavaJAR
- 生成組合物件之二進位制反射格雷碼(c++)物件反射C++
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- Java反射—初探反射基礎Java反射
- 基於Java反射的定時任務設計Java反射
- 基於PostgreSQL進行Java應用開發SQLJava
- 檔案上傳之三基於flash的檔案上傳
- 基於uploadify.js實現多檔案上傳和上傳進度條的顯示JS
- java project打包生成jar包(通用)JavaProjectJAR
- java基礎:深入理解Class物件與反射機制Java物件反射
- Java 反射基礎Java反射
- java基礎——反射Java反射
- [Java基礎]反射Java反射
- 基於SpringMVC的上傳圖片SpringMVC
- 基於WebUploader的圖片上傳Web
- 如何使用maven生成可以執行的jar?MavenJAR
- 【Java基礎】--上傳檔案Java
- Java基礎系列—Java反射Java反射
- java中關於如何執行jar格式程式的說明JavaJAR
- 【譯】2. Java反射——Class物件Java反射物件
- canvas 繪製的圖片,進行上傳Canvas
- maven - 引用本地jar,進行jar包移動MavenJAR
- 使用Mavne生成可以執行的jar檔案JAR
- 怎麼生成可執行的.jar檔案???????????JAR
- 將一個帶有main方法的jar生成為可執行jarAIJAR
- Java基礎(十八)反射Java反射
- Java-基礎-反射Java反射
- Java基礎(十一)——反射Java反射
- jar命令打包與java執行jar包JARJava