今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改变某些参数的值。
突然,想到一个问题,就是在线上运行服务器时,假如我要改变某个参数的值,有
没有办法呢?通过查找资料后,发现jdk竟然也提供了动态编译的工具。因此,我
们可以让java变成一个脚本语言。我发送一个类的代码到服务端,动态编译后,利
用反射来执行。代码很简单,我从网上找了一个例子简单改装一下
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.Scanner;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
public class CompileTest {
public static final String CLASS_CONTENT = "public class HelloWorld{public static void run(){##;}}";
public static void main(String[] args) throws Exception {
Scanner scanner =new Scanner(System.in);
String code = scanner.nextLine();
code = CLASS_CONTENT.replace("##", code);
//获取编译器.注意,运行时需要jdk,单纯的jre没有编译器
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
JavaFileObject fileObject = new JavaStringObject("HelloWorld",
code);
//编译过程
CompilationTask task = javaCompiler.getTask(null, null, null,
Arrays.asList("-d", "./bin"), null, Arrays.asList(fileObject));
if (!task.call()) {
System.out.println("编译失败!");
} else {
System.out.println("编译成功!");
//成功以后,就利用发射来执行这个类了
URL[] urls = new URL[] { new URL("file:/" + "./bin/") };
URLClassLoader classLoader = new URLClassLoader(urls);
Class<?> clazz = classLoader.loadClass("HelloWorld");
Method method = clazz.getDeclaredMethod("run");
method.invoke(clazz.newInstance());
}
}
static class JavaStringObject extends SimpleJavaFileObject {
private String code;
public JavaStringObject(String name, String code) {
super(URI.create(name + ".java"), Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors)
throws IOException {
return code;
}
}
}
运行代码
输入一条java语句,例如:System.out.println("hello,美女!");
总结
利用java的这个小特性,我们可以做一些有益的事情,很多时候不需要为了更改某些参数而停服了。
参考资料
http://www.cnblogs.com/flyoung2008/
分享到:
相关推荐
在这里,我们将有一个包含字符串的“var”仍然包含一个数组的“var”,因此程序员不必担心优化过程或进行转换以稍后处理数据使用此库接近典型的 Java脚本语言,虽然不是 Groovy 的方式,即引入了另一种语言,而是...
它是由Netscape最初开发了一个Livescript语言,在Navigator和Web服务器产品中加进了基本的脚本功能。当Navigator 2.0中加进了Java小程序支持后,Netscape把Livescript 变成了JavaScript。最初的JavaScript只不过是 ...
我们知道,在很多脚本语言中都有eval函数,它可以把字符串转换为表达式并执行.如在javaScript中: var str = aid.value + ".style.top = 10;" 把一个id为"aid"的控制的值取出来加合并成一个字符串,如果aid的值是...
它是一个跨平台脚本语言,深受C、C++和Java的影响。 在 Linux 命令行中运行 PHP 代码 PHP的语法和C、Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被2.6亿个网站所使用,当前最新的稳定...
JavaFX Script编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative,statically typed(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为 JavaFX Script...
JavaFX Script 编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative, statically typed(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为 JavaFX Script...
把表单内用户输入的中文逗号即全角字符转换为英文逗号即半角符号,需要使用客户端脚本语言javascript来实现,请看下面的代码:
9、提供脚本编程功能,直接在报表模板中自定义报表行为,采用通用的JScript与VBScript脚本引擎。 10、特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现并垂直居中要求。 11、全中文界面,针对中国...
尽管现有的 EmployeeMgmt 应用程序已经有了 Façade 接口,但这个接口是暴露给 Servlet 使用的,最好能再为 Flex 定义另一个接口 FlexService,并隐藏 Java 语言的特定对象(如 清单 1 所示): 清单 1. Flex...
ade 接口,但这个接口是暴露给 Servlet 使用的,最好能再为 Flex 定义另一个接口 FlexService,并隐藏 Java 语言的特定对象(如 清单 1 所示): 清单 1. FlexService interface public interface FlexService ...
commons-daemon 可以帮你实现将一个普通的 Java 应用变成系统的一个后台服务 commons-dbcp 数据连接池服务 commons-dbutils JDBC 辅助类 commons-digester XML 文件到 Java 对象的映射机制 commons-discovery ...
commons-daemon 可以帮你实现将一个普通的 Java 应用变成系统的一个后台服务 commons-dbcp 数据连接池服务 commons-dbutils JDBC 辅助类 commons-digester XML 文件到 Java 对象的映射机制 commons-discovery ...
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机 App,交互逻辑都是由JavaScript驱动的。 简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言...
您喜欢的语言突然也变成了脚本语言。 或考虑其他创新用途。 它是如何工作的? 源文件的第一行是目标语言的注释,但是它同时是bash命令,用于编译文件本身并运行编译结果。 如何使创建自己的可执行文件? 制作...
支持与Python、C/C++、Fortran、Java等语言结合使用,以适应不同领域的需求。 拥有丰富的库、函数和工具箱,能够进行矩阵运算、统计分析、图像处理、数值优化等常见操作。 提供友好的界面和交互式环境,使用户能够...
能够以分页方式显示多个文件 支持许多种变成语言的语法加亮,包括awk、DOS批处理脚本、C/C 、diff/patch、HTML、Java、JavaScript、Pascal、PHP、Perl、Python、Ruby、UNIX Shell脚本、汇编语言 可在Windows平台下...
此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。 在某个Linux网站上面有这样的话:"如果你问一下Linux爱好者最喜欢...
MATLAB的主要优点在于,它使每个人都可以使用该编程,并且与某些常规编程语言(例如Java,C,C ++,Visual Basic等)相比,它可以非常快速地将思想变成可行的产品。 您将学到什么 您可以放心地使用MATLAB来解决问题 ...
第四部分给出使用了JavaServer Page的大量的上下文——其如何与servlet、applet、Perl脚本、FTP、CGI、ASP和其他服务器端代理进行通信。在书的最后部分还包含三个附录:Servlet API、JSP API和HTTP参考。 最后,我...