当前位置: 首页 > news >正文

网站的风格与布局的设计大庆免费网站建设公

网站的风格与布局的设计,大庆免费网站建设公,国内网站空间 linux,找资源的关键词有哪些Java类动态加载(一)——java源文件动态编译为class文件最近在做java动态加载这方面的工作#xff0c;起初也遇到了很多困难。网上关于这方便的东西很零散#xff0c;为了便于日后回过头来再看#xff0c;于是我将这几天的心得体会总结如下。什么情况下会需要用java程序动态的…Java类动态加载(一)——java源文件动态编译为class文件最近在做java动态加载这方面的工作起初也遇到了很多困难。网上关于这方便的东西很零散为了便于日后回过头来再看于是我将这几天的心得体会总结如下。什么情况下会需要用java程序动态的编译java源文件动态的加载java类文件呢如果很少遇到这样的需求的兄弟们可能不会清楚动态的编译、动态的加载用在一个什么样的场景。下面我将我遇到的场景描述下。Sdl说明为了更好的说明需求先解释下我这里的sdl文件是干什么用的。sdl文件里面主要是定义了一些远程调用接口的相关信息根据这些信息我们可以自己手动生成java版本的远程调用接口。具体有些什么东西呢比如说接口的名称、所在包路径、接口参数、接口用的java bean等等。我们得到这些sdl文件后可以利用sdl2java.exe或者sdl2java.sh工具将文件编译成java源文件利用这些源文件就可以进行远程接口调用。需求说明用户只提供一个sdl文件需要程序能够根据这个sdl文件提取出所有远程调用接口让用户在前端输入参数然后进行远程调用。实现方案用户上传一个sdl文件到工程临时目录然后程序自动的调用sdl2java.exe或者sdl2java.sh命令将sdl文件动态编译成一系列的java源文件然后程序动态的将这些java文件编译成class文件最后再动态加载到项目中。整个实现方案有三个难点用java程序调用sdl2java.exe或者sdl2java.sh命令解析sdl文件生成一系列的java源文件动态编译上述java源文件为class类文件动态加载class类文件本文讲解的实现方案的前提本文主要讲解第二个难点如何实现因此假设程序已经实现了将sdl文件转换成了一系列的java文件并存放到服务器中根目录的temp\sdl\src目录中动态将java文件编译为class文件解决方案将temp\sdl\src目录中的java源文件编译成class文件并存放到temp\sdl\classes目录中。java中早就提供了用java方式去动态编译java源文件的接口有关java动态编译的API都在javax.tools包中。本文主要使用jdk1.6以上版本提供的JavaCompiler工具来动态编译java源文件。我们可以通过ToolProvider类的静态方法getSystemJavaCompiler得到JavaCompiler对象实例。// 获取编译器实例JavaCompiler compiler ToolProvider.getSystemJavaCompiler();得到JavaCompiler对象实例后我们可以调用该工具的getTask(Writer out, JavaFileManager fileManager, DiagnosticListener super JavaFileObject diagnosticListener, Iterable options, Iterable classes, Iterable extends JavaFileObject compilationUnits) 方法获取一个编译任务对象。CompilationTask compilationTask compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);该方法的第一个参数为文件输出这里我们可以不指定我们采用javac命令的-d参数来指定class文件的生成目录。第二个参数为文件管理器实例// 获取标准文件管理器实例StandardJavaFileManager fileManager compiler.getStandardFileManager(null, null, null);该文件管理器实例的作用就是将我们需要动态编译的java源文件转换为getTask需要的编译单元。// 获取要编译的编译单元Iterable extends JavaFileObject compilationUnits fileManager.getJavaFileObjectsFromFiles(sourceFileList);第三个参数DiagnosticCollector diagnostics是在编译出错时存放编译错误信息。第四个参数为编译命令选项就是javac命令的可选项这里我们主要使用了-d和-sourcepath这两个选项。/*** 编译选项在编译java文件时编译程序会自动的去寻找java文件引用的其他的java源文件或者class。 -sourcepath选项就是定义java源文件的查找目录 -classpath选项就是定义class文件的查找目录-d就是编译文件的输出目录。*/Iterable options Arrays.asList(-d, targetDir, -sourcepath, sourceDir);第五个参数为类名称具体作用没研究清楚。第六个参数为上面提到的编译单元就是我们需要编译的java源文件当我们得到CompilationTask compilationTask编译任务后我们就可以调用compilationTask.call()方法进行编译工作// 运行编译任务compilationTask.call()下面代码的运行前提条件首先需要将附件中的sdl.rar文件解压到F:\亚信工作\SDL文件目录下sdl目录结构见下图由于编译这些java文件需要用到两个与sdl相关的jar包因此在运行下面的代码前需要将sdl.rar中lib目录下的jar包导入到工程里面来。源代码如下直接运行里面的main方法即可。运行后如果输出编译成功则程序正常运行可以通过查看sdl\classes目录中是否有class文件检查运行结果。package util;import java.io.File;import java.io.FileFilter;import java.io.FilenameFilter;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.tools.Diagnostic;import javax.tools.DiagnosticCollector;import javax.tools.JavaCompiler;import javax.tools.JavaFileObject;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;import javax.tools.JavaCompiler.CompilationTask;import org.apache.commons.lang.StringUtils;/*** author zhengtian** date 2012-4-17 下午07:24:24*/SuppressWarnings(all)public class DynamicCompilerUtil {/*** 编译java文件** param filePath* 文件或者目录(若为目录自动递归编译)* param sourceDir* java源文件存放目录* param targetDir* 编译后class类文件存放目录* param diagnostics* 存放编译过程中的错误信息* return* throws Exception*/public static boolean compiler(String filePath, String sourceDir, String targetDir, DiagnosticCollector diagnostics)throws Exception {// 获取编译器实例JavaCompiler compiler ToolProvider.getSystemJavaCompiler();// 获取标准文件管理器实例StandardJavaFileManager fileManager compiler.getStandardFileManager(null, null, null);try {if (StringUtils.isEmpty(filePath) StringUtils.isEmpty(sourceDir) StringUtils.isEmpty(targetDir)) {return false;}// 得到filePath目录下的所有java源文件File sourceFile new File(filePath);List sourceFileList new ArrayList();getSourceFiles(sourceFile, sourceFileList);// 没有java文件直接返回if (sourceFileList.size() 0) {System.out.println(filePath 目录下查找不到任何java文件);return false;}// 获取要编译的编译单元Iterable extends JavaFileObject compilationUnits fileManager.getJavaFileObjectsFromFiles(sourceFileList);/*** 编译选项在编译java文件时编译程序会自动的去寻找java文件引用的其他的java源文件或者class。 -sourcepath选项就是定义java源文件的查找目录 -classpath选项就是定义class文件的查找目录。*/Iterable options Arrays.asList(-d, targetDir, -sourcepath, sourceDir);CompilationTask compilationTask compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);// 运行编译任务return compilationTask.call();} finally {fileManager.close();}}/*** 查找该目录下的所有的java文件** param sourceFile* param sourceFileList* throws Exception*/private static void getSourceFiles(File sourceFile, List sourceFileList) throws Exception {if (sourceFile.exists() sourceFileList ! null) {// 文件或者目录必须存在if (sourceFile.isDirectory()) {// 若file对象为目录// 得到该目录下以.java结尾的文件或者目录File[] childrenFiles sourceFile.listFiles(new FileFilter() {public boolean accept(File pathname) {if (pathname.isDirectory()) {return true;} else {String name pathname.getName();return name.endsWith(.java) ? true : false;}}});// 递归调用for (File childFile : childrenFiles) {getSourceFiles(childFile, sourceFileList);}} else {// 若file对象为文件sourceFileList.add(sourceFile);}}}public static void main(String[] args) {try {// 编译F:\\亚信工作\\SDL文件\\sdl\\src目录下的所有java文件String filePath F:\\亚信工作\\SDL文件\\sdl\\src;String sourceDir F:\\亚信工作\\SDL文件\\sdl\\src;String targetDir F:\\亚信工作\\SDL文件\\sdl\\classes;DiagnosticCollector diagnostics new DiagnosticCollector();boolean compilerResult compiler(filePath, sourceDir, targetDir, diagnostics);if (compilerResult) {System.out.println(编译成功);} else {System.out.println(编译失败);for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {// System.out.format(%s[line %d column %d]--%s%n, diagnostic.getKind(), diagnostic.getLineNumber(),// diagnostic.getColumnNumber(),// diagnostic.getMessage(null));System.out.println(diagnostic.getMessage(null));}}} catch (Exception e) {e.printStackTrace();}}}
http://www.pierceye.com/news/307133/

相关文章:

  • 内蒙古建设 招聘信息网站平台搭建
  • 做网站公司共有几处密码公司seo营销
  • 镇江网站制作费用广东华电建设股份有限公司网站
  • 西安知名的集团门户网站建设服务商潍坊网站开发asp培训
  • 网站服务器连接被重置为什么高德地图没有外国位置信息
  • 帝国cms 仿站 wordpress天津新亚太工程建设监理有限公司网站
  • 精品网站导航 做最好的导航网站建设数据库选择
  • 蓝杉网站建设公司贵阳网站建设公司排名
  • 苏州专业高端网站建设机构建网站公司下载快手
  • 中堂仿做网站个人网站设计论文道客巴巴
  • 怎么用ps做网站效果图24什么网站建设
  • 网站开发技术有网站建设方案 pdf
  • 网站建设教程浩森宇特福州医院网站建设公司
  • 怎样在网站上做超链接网站商城是用什么框架做的
  • 网站建设增城wordpress新文章类型
  • 广州市招投标中心官网上海网站关键词优化
  • 很多网站开发没有框架如何制作的长沙旅游景点大全排名
  • 云南网站推广的目的做动画的网站有哪些
  • 网站建设公司在哪里找资源模拟建设网站
  • 如何盗用网站模板哈尔滨公告
  • 管理咨询网站焦作专业做网站公司哪家好
  • 在国内做跨境电商怎么上外国网站网站不收录
  • 网站介绍ppt怎么做屏蔽网站ip
  • it公论 是建立在什么网站wordpress搬迁数据库连接失败
  • 南县建设局网站营销型网站开发流程包括
  • 有关应用网站申请免费网站空间
  • 二手书交易网站开发现状营销型网站建设推荐乐云seo
  • 山西网站建设怎么样seo优化网站多少钱
  • 网站建设设计模板磁力链最佳的搜索引擎
  • 单位外部网站建设价格哪些网站可以做视频直播