`
kongshanxuelin
  • 浏览: 927035 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

动态运行Java代码

阅读更多

有些情况下,我们不得不动态运行Java代码,以便提供更加灵活的方式,以下代码可参考(在JDK 1.5+平台上运行通过):

	public static void main(String[] args) {
//		PrintWriter out;
//		PrintStream myOut = new PrintStream(out);
//		System.setOut(myOut);
//		System.setErr(myOut);

		int i = 10;
		String code = "System.out.println(\"Hello World!\"+(13+2*5/3));";
		code += "for(int i=0;i<" + i + ";i++){";
		code += " System.out.println(Math.pow(i,2));";
		code += "}";
		try {
			run(code);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private synchronized static File compile(String code) throws Exception {
		File file = File.createTempFile("JavaRuntime", ".java", new File(System
				.getProperty("user.dir")));
		file.deleteOnExit();

		//		获得类名 
		String classname = getBaseFileName(file);

		//		将代码输出到文件 
		PrintWriter out = new PrintWriter(new FileOutputStream(file));
		out.println(getClassCode(code, classname));
		out.close();

		//		编译生成的java文件 
		String[] cpargs = new String[] { "-d",
				System.getProperty("user.dir") + "\\WebRoot\\WEB-INF\\classes",
				file.getName() };
		int status = Main.compile(cpargs);
		if (status != 0) {
			throw new Exception("语法错误!");
		}

		return file;
	}

	private static synchronized void run(String code) throws Exception {
		String classname = getBaseFileName(compile(code));
		new File(System.getProperty("user.dir")
				+ "\\WebRoot\\WEB-INF\\classes\\" + classname + ".class")
				.deleteOnExit();
		try {
			Class cls = Class.forName(classname);
			Method main = cls.getMethod("method", null);
			main.invoke(cls, null);
		} catch (Exception se) {
			se.printStackTrace();
		}
	}

	private static String getClassCode(String code, String className) {
		StringBuffer text = new StringBuffer();

		text.append("public class " + className + "{\n");
		text.append(" public static void method(){\n");
		text.append(" " + code + "\n");
		text.append(" }\n");
		text.append("}");

		return text.toString();
	}

	private static String getBaseFileName(File file) {
		String fileName = file.getName();
		int index = fileName.indexOf(".");
		String result = "";
		if (index != -1) {
			result = fileName.substring(0, index);
		} else {
			result = fileName;
		}
		return result;
	}
 
分享到:
评论
6 楼 timonzhang 2008-12-16  
       1.6里可以使用JavaCompiler和JavaCompiler.CompilationTask 实现。问题是这些只算做到了动态编译,不算真正意义上的动态运行
5 楼 bloodrate 2008-12-16  
Main.compile
貌似不在标准的jdk lib里阿
4 楼 bluky999 2008-12-15  
请问上述代码中的 Main 类是哪个Main ?????

 int status = Main.compile(cpargs);  
 if (status != 0) {  
       throw new Exception("语法错误!");  
 }  
3 楼 stephen_chenxifei 2008-09-19  
正在被使用的class,使用动态运行java代码,就不用重新启动服务了,相当于热发布这个class,是不是可以这样理解,需要研究下下,现在每次发布更新程序,真是搞死了人了。
2 楼 longlongriver 2008-09-19  
cnhzliye 写道
用beanshell

正解!这种场景非常适合用脚本中间件!
1 楼 cnhzliye 2008-09-19  
用beanshell

相关推荐

    Java动态编译Java代码,运行在内存中,并执行

    添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...

    Java直接运行JS代码

    Java提供了这样的能力,让我们可以直接在Java程序中运行JS代码。这主要得益于Oracle公司在Java 6版本引入的一个新特性——Java Scripting API(JSR 223),它允许Java程序执行多种脚本语言,包括JavaScript。 ### 1...

    java代码快捷编译运行工具

    Java代码快捷编译运行工具是针对初学者设计的一款实用程序,旨在简化Java编程过程中常见的编译和运行步骤。对于刚接触Java编程的开发者来说,通过命令行(CMD)进行源码的javac编译和java运行可能会感到繁琐,而这款...

    内存中动态编译执行java代码

    内存中动态编译执行Java代码是一种高级编程技巧,它允许我们在程序运行时根据需要创建、编译和执行新的Java代码。这种技术在某些场景下非常有用,比如在元编程、插件系统、自定义脚本执行或者代码热更新中。在Java中...

    java动态代码执行

    Java动态代码执行是一种在运行时编译和执行代码的技术,它可以极大地提高程序的灵活性和可扩展性。在Java中,Groovy是一个强大的脚本语言,它与Java语法兼容,并且可以无缝集成到Java应用程序中,使得动态代码执行变...

    java 动态编译.java文件,动态运行类 _1.3

    在Java编程中,动态编译和运行类是一项重要的技术,特别是在需要实时更新代码或实现热部署的场景下。本文将详细讲解如何在Java中实现动态编译.java源代码文件并执行编译后的类。 首先,我们需要理解Java的编译过程...

    用BeanShell来运行java脚本

    标题中的“用BeanShell来运行Java脚本”指的是利用BeanShell这个开源库在Java环境中执行动态的、交互式的Java代码。BeanShell是一个轻量级的Java Scripting引擎,它允许你在运行时执行Java代码,无需编译,极大地...

    动态生成、编译、运行java文件

    在实际应用中,动态生成、编译和运行Java代码的示例包括: 1. **元编程**:例如,Lombok库使用注解处理器在编译时生成getter、setter等方法。 2. **插件系统**:如OSGI框架,允许在运行时安装、卸载和更新插件,每...

    Java动态生成代码并编译载入

    比如,当需要实现动态配置的业务规则时,可以通过这种方式将用户定义的规则转换为Java代码并加载执行。再比如,某些性能敏感的系统可能使用这种方法来即时生成和优化特定场景的代码,以达到更高的运行效率。 总的来...

    JAVA代码生成,支持模板自定义,完美运行

    1.codeFactory: Java代码生成,依赖rapid-generator.4.0.6.jar, 支持自定义模板生成代码, 弱业务下完全解放体力劳动. 2.ssm模板实现:pojo,dao,daoimpl,service,serviceimpl,controller,各mapper.xml 代码自动生成, 3....

    C++代码转java工具

    在某些情况下,开发者可能需要将已有的C++代码转换为Java代码,以便在Java平台上运行或利用Java的生态系统。 标题“C++代码转Java工具”暗示了一个软件或服务的存在,它的功能是自动化C++源代码到Java源代码的转换...

    Java2Pas Java代码转pas代码

    此外,如果Java代码中包含了一些特定于Java平台的API调用,这些部分在Pascal中可能需要替换为相应的函数或库。 总的来说,Java2Pas是一个方便的工具,能够帮助开发者跨越Java和Pascal之间的语言障碍,提高代码复用...

    OnlyOffice官网示例Java代码

    在这个"OnlyOffice官网示例Java代码"中,我们可以看到官方提供的Java代码示例,这些示例经过修改后可以直接运行,只需简单地调整服务器IP地址即可。 首先,让我们了解一下OnlyOffice的API接口。OnlyOffice 提供的...

    在手机上编辑运行java代码

    有了此工具,当偶然有个想法想测验、实现时,无需开电脑直接在手机上即个录入java代码并编译运行

    Java动态生成代码并编译载入.pdf

    Java动态生成代码并编译载入是一个高级的编程技术,主要用于那些需要在应用程序运行时根据某些模板和数据动态地生成、编译和加载Java代码的场景。这种技术在需要高度定制化处理或是运行时参数化生成业务逻辑的系统中...

    java代码命令行编译在手机上运行的示例

    java代码命令行编译在手机上运行的示例。 chcp 65001 javac -encoding utf-8 ./org/test/TestJava.java dx --dex --output =D:\pro\TestJava.dex .\org\test\TestJava.class

    shell,bat脚本运行java程序

    当需要定期或按需运行Java程序时,利用这两种脚本语言可以极大地提高工作效率。下面将详细介绍如何使用shell脚本(适用于Unix/Linux系统)和bat脚本(适用于Windows系统)来运行Java程序。 **shell脚本运行Java程序...

    批处理执行java代码

    批处理执行Java代码是一种在没有用户交互的情况下自动化运行Java程序的方法。这通常涉及到创建一个批处理脚本(在Windows系统中是`.bat`文件,在Unix或Linux系统中是`.sh`文件),然后在这个脚本中调用Java命令来...

    java代码转c#

    描述中的"java to c# java to csharp java2c# java代码转c#"进一步强调了转换的目标,表示用户可能已经花费了一定的时间寻找如何将Java代码转换为C#的方法,这可能包括在线搜索、阅读文档或者尝试不同的工具。...

    linux+python+appium运行java代码dmeo

    linux+python+appium运行java代码dmeo

Global site tag (gtag.js) - Google Analytics