`
janeky
  • 浏览: 365942 次
  • 性别: 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  
哥哥,你要说啥,不明白啊

相关推荐

    读取Excel生成Sql脚本

    总的来说,"读取Excel生成Sql脚本"是一个利用Java编程语言,结合JDBC和POI库实现的数据处理工具。它简化了从Excel到数据库的数据迁移过程,提升了数据操作的效率。对于熟悉Java和数据库的开发者来说,这是一个非常有...

    脚本编程语言:Lua.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

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

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

    shell脚本学习手册

    Shell,是Linux系统中的一种命令语言和程序设计语言,它由C语言编写,作为用户与操作系统内核交互的桥梁。Shell不仅提供了命令行接口,还允许用户编写脚本程序,实现自动化任务处理。本文将深入探讨Shell脚本的基本...

    脚本编程语言:R.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:Tcl.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:Python.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:Ruby.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:Perl.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:JavaScript.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:PowerShell.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:PHP.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    脚本编程语言:Bash.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    java代码生成html文件

    在IT行业中,Java是一种广泛应用的编程语言,尤其在构建Web应用程序方面。本示例将探讨如何使用Java生成HTML文件,这是构建动态网站或自动化报告等任务时常见的需求。通过Java生成HTML,我们可以将数据结构转化为...

    常见编程语言:Java.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    数据分析编程语言:Java.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    面向对象编程语言:Java.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 ...等所有常见的变成语言系列教程

    TPCL语言编程基础,简单指令

    TPCL(Tec Printer Control Language)是一种脚本语言,能被TOSHIBA打印机识别的语言。TPCL语言能做什么? * 打印各式标签、文本、条码、图形 * 设置打印机参数,如温度、速度、碳带扭矩 * 获取打印机状态 TPCL...

    MyEclipse10汉化包自动脚本

    - 重启MyEclipse:执行完脚本后,关闭并重新启动MyEclipse,此时,你应该能看到已经变为中文的界面。 2. **注意事项** - 兼容性:务必确认汉化包与你的MyEclipse10版本兼容,否则可能导致错误或不稳定现象。 - ...

    jsp简单语法,servlet,JSP概述,JSP页面构成,注释,指令,脚本元素,动作元素,错误处理

    - **脚本元素**:包括声明(declarations)、脚本let(scriptlets)和表达式(expressions),用于编写Java代码。 - **指令**:用于配置页面或者影响JSP编译过程,如`&lt;%@ page %&gt;`, `&lt;%@ include %&gt;`, `...

Global site tag (gtag.js) - Google Analytics