`
janeky
  • 浏览: 364032 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

让java变成脚本语言

阅读更多

今天在弄游戏的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/

10
15
分享到:
评论
12 楼 永志_爱戴 2014-07-15  
没感觉有多大实用之处,不过还是蛮好玩的,长见识了
11 楼 javaking1999 2012-08-15  
哥哥 什么事 gm
10 楼 leavesforeye 2012-08-15  
其实我觉得就是让java程序支持命令嘛。
我们定义一些命令执行就可以了。
绕弯最后还是java字节码在执行,我觉得划不来
9 楼 沙舟狼客 2012-08-15  
用groovy啊,多方便,与java完全兼容的
8 楼 perfect5085 2012-08-15  
不错啊,以后做一些线上测试,直接放代码了。
7 楼 witcheryne 2012-08-15  
囧```
如果纯做可行性研究, 这么用算是长见识了...

6 楼 mainlove 2012-08-15  
不就是  java内存编译么
5 楼 elan1986 2012-08-15  
我想说的是,如果你要看深入看JDK动态代理的话 就知道了!
4 楼 janeky 2012-08-15  
kilometo 写道
哥哥,你要说啥,不明白啊


大体意思是:你可以在程序中动态生成一个java类,然后直接编译,运行。
3 楼 janeky 2012-08-15  
no1dog 写道
贴主的意思是gm写了个类,要在线上动态编译。。。。。。。。。。。。。。







这啃爹啊..........................

万一写错咋办,万一写恶意代码咋办


这个权限是开发人员自己控制的,只是适用于某些情况下,比如线上某个配置要临时修改,
但是之前没有这样的接口,又不想停服修改,那就用我说的这个办法试试吧
2 楼 no1dog 2012-08-15  
贴主的意思是gm写了个类,要在线上动态编译。。。。。。。。。。。。。。







这啃爹啊..........................

万一写错咋办,万一写恶意代码咋办
1 楼 kilometo 2012-08-15  
哥哥,你要说啥,不明白啊

相关推荐

    Joove:编写java代码脚本的最佳方式-开源

    在这里,我们将有一个包含字符串的“var”仍然包含一个数组的“var”,因此程序员不必担心优化过程或进行转换以稍后处理数据使用此库接近典型的 Java脚本语言,虽然不是 Groovy 的方式,即引入了另一种语言,而是...

    javascript原理

    它是由Netscape最初开发了一个Livescript语言,在Navigator和Web服务器产品中加进了基本的脚本功能。当Navigator 2.0中加进了Java小程序支持后,Netscape把Livescript 变成了JavaScript。最初的JavaScript只不过是 ...

    在java中利用动态编译实现eval

    我们知道,在很多脚本语言中都有eval函数,它可以把字符串转换为表达式并执行.如在javaScript中: var str = aid.value + ".style.top = 10;"  把一个id为"aid"的控制的值取出来加合并成一个字符串,如果aid的值是...

    如何通过Linux命令行使用和运行PHP脚本

    它是一个跨平台脚本语言,深受C、C++和Java的影响。 在 Linux 命令行中运行 PHP 代码 PHP的语法和C、Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被2.6亿个网站所使用,当前最新的稳定...

    javafx2.0官方例子

    JavaFX Script编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative,statically typed(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为 JavaFX Script...

    JavaFX官方教程

    JavaFX Script 编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative, statically typed(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为 JavaFX Script...

    把表单内输入的中文逗号自动转换为英文逗号

    把表单内用户输入的中文逗号即全角字符转换为英文逗号即半角符号,需要使用客户端脚本语言javascript来实现,请看下面的代码:

    锐浪报表Grid++Report5.3

    9、提供脚本编程功能,直接在报表模板中自定义报表行为,采用通用的JScript与VBScript脚本引擎。 10、特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现并垂直居中要求。 11、全中文界面,针对中国...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    尽管现有的 EmployeeMgmt 应用程序已经有了 Façade 接口,但这个接口是暴露给 Servlet 使用的,最好能再为 Flex 定义另一个接口 FlexService,并隐藏 Java 语言的特定对象(如 清单 1 所示): 清单 1. Flex...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    ade 接口,但这个接口是暴露给 Servlet 使用的,最好能再为 Flex 定义另一个接口 FlexService,并隐藏 Java 语言的特定对象(如 清单 1 所示): 清单 1. FlexService interface public interface FlexService ...

    Jakarta commons docs API CHM 格式

    commons-daemon 可以帮你实现将一个普通的 Java 应用变成系统的一个后台服务 commons-dbcp 数据连接池服务 commons-dbutils JDBC 辅助类 commons-digester XML 文件到 Java 对象的映射机制 commons-discovery ...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-daemon 可以帮你实现将一个普通的 Java 应用变成系统的一个后台服务 commons-dbcp 数据连接池服务 commons-dbutils JDBC 辅助类 commons-digester XML 文件到 Java 对象的映射机制 commons-discovery ...

    廖雪峰JavaScript教程

    JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机 App,交互逻辑都是由JavaScript驱动的。 简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言...

    executable-source-code:可执行的源文件,可帮助每个人以自己喜欢的系统语言编写工具-e language source code

    您喜欢的语言突然也变成了脚本语言。 或考虑其他创新用途。 它是如何工作的? 源文件的第一行是目标语言的注释,但是它同时是bash命令,用于编译文件本身并运行编译结果。 如何使创建自己的可执行文件? 制作...

    通过python,将数据展示变为matlab绘图代码.zip

    支持与Python、C/C++、Fortran、Java等语言结合使用,以适应不同领域的需求。 拥有丰富的库、函数和工具箱,能够进行矩阵运算、统计分析、图像处理、数值优化等常见操作。 提供友好的界面和交互式环境,使用户能够...

    MadEdit编辑器

    能够以分页方式显示多个文件 支持许多种变成语言的语法加亮,包括awk、DOS批处理脚本、C/C 、diff/patch、HTML、Java、JavaScript、Pascal、PHP、Perl、Python、Ruby、UNIX Shell脚本、汇编语言 可在Windows平台下...

    Java-PHP-C#

    此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。 在某个Linux网站上面有这样的话:"如果你问一下Linux爱好者最喜欢...

    matlab转换java代码-Complete-MATLAB-Tutorial-Go-from-Beginner-to-Pro:完整的MATL

    MATLAB的主要优点在于,它使每个人都可以使用该编程,并且与某些常规编程语言(例如Java,C,C ++,Visual Basic等)相比,它可以非常快速地将思想变成可行的产品。 您将学到什么 您可以放心地使用MATLAB来解决问题 ...

    《JSP技术大全》pdg格式

    第四部分给出使用了JavaServer Page的大量的上下文——其如何与servlet、applet、Perl脚本、FTP、CGI、ASP和其他服务器端代理进行通信。在书的最后部分还包含三个附录:Servlet API、JSP API和HTTP参考。  最后,我...

Global site tag (gtag.js) - Google Analytics