打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
让java变成脚本语言

今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改变某些参数的值。

 

突然,想到一个问题,就是在线上运行服务器时,假如我要改变某个参数的值,有

 

没有办法呢?通过查找资料后,发现jdk竟然也提供了动态编译的工具。因此,我

 

们可以让java变成一个脚本语言。我发送一个类的代码到服务端,动态编译后,利

 

用反射来执行。代码很简单,我从网上找了一个例子简单改装一下


Java代码  
  1. import java.io.IOException;  
  2. import java.lang.reflect.Method;  
  3. import java.net.URI;  
  4. import java.net.URL;  
  5. import java.net.URLClassLoader;  
  6. import java.util.Arrays;  
  7. import java.util.Scanner;  
  8.   
  9. import javax.tools.JavaCompiler;  
  10. import javax.tools.JavaCompiler.CompilationTask;  
  11. import javax.tools.JavaFileObject;  
  12. import javax.tools.SimpleJavaFileObject;  
  13. import javax.tools.ToolProvider;  
  14.   
  15. public class CompileTest {  
  16.   
  17.     public static final String CLASS_CONTENT = "public class HelloWorld{public static void run(){##;}}";  
  18.   
  19.     public static void main(String[] args) throws Exception {  
  20.         Scanner scanner =new Scanner(System.in);  
  21.         String code = scanner.nextLine();  
  22.         code = CLASS_CONTENT.replace("##", code);  
  23.           
  24.         //获取编译器.注意,运行时需要jdk,单纯的jre没有编译器  
  25.         JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();  
  26.         JavaFileObject fileObject = new JavaStringObject("HelloWorld",  
  27.                 code);  
  28.         //编译过程  
  29.         CompilationTask task = javaCompiler.getTask(nullnullnull,  
  30.                 Arrays.asList("-d""./bin"), null, Arrays.asList(fileObject));  
  31.         if (!task.call()) {  
  32.             System.out.println("编译失败!");  
  33.         } else {  
  34.             System.out.println("编译成功!");  
  35.   
  36.             //成功以后,就利用发射来执行这个类了  
  37.             URL[] urls = new URL[] { new URL("file:/" + "./bin/") };  
  38.             URLClassLoader classLoader = new URLClassLoader(urls);  
  39.             Class<?> clazz = classLoader.loadClass("HelloWorld");  
  40.             Method method = clazz.getDeclaredMethod("run");  
  41.             method.invoke(clazz.newInstance());  
  42.         }  
  43.   
  44.     }  
  45.   
  46.     static class JavaStringObject extends SimpleJavaFileObject {  
  47.         private String code;  
  48.   
  49.         public JavaStringObject(String name, String code) {  
  50.             super(URI.create(name + ".java"), Kind.SOURCE);  
  51.             this.code = code;  
  52.         }  
  53.   
  54.         @Override  
  55.         public CharSequence getCharContent(boolean ignoreEncodingErrors)  
  56.                 throws IOException {  
  57.             return code;  
  58.         }  
  59.     }  
  60. }  

 

运行代码

输入一条java语句,例如:System.out.println("hello,美女!"); 

 

总结

利用java的这个小特性,我们可以做一些有益的事情,很多时候不需要为了更改某些参数而停服了。

 

参考资料

http://www.cnblogs.com/flyoung2008/

9
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  
哥哥,你要说啥,不明白啊
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java SE 6 新特性: 编译器 API
Java版的实现JavaScript中的eval()函数
java动态编译执行
Java SE6调用Java编译器的两种新方法
调用Java编译器API编译Java-docman.cn 翻译家 -JavaEye技术社区
jsp文件下载完整方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服