.首先我们来认识一下 java中的一个对象 JavaCompiler

JavaCompiler : 不知道肯定很陌生,其实这个api出来很久了,他是jdk6的特性,用来编译java的源程式的,详细介绍可以参考百度或google一下,介绍都很详细

Java的反射 : 这个我不多做介绍了,程序中很常见,基本上java程序员都会接触到,列入金典的框架 spring 等等

 /*** 装载字符串成为java可执行文件* @param className className* @param javaCodes javaCodes* @return Class*/private  Class<?> compile(String className, String javaCodes) {JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,                 null, null);StrSrcJavaObject srcObject = new StrSrcJavaObject(className, javaCodes);Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(srcObject);String flag = "-d";String outDir = "";try {File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());outDir = classPath.getAbsolutePath() + File.separator;} catch (URISyntaxException e1) {e1.printStackTrace();}Iterable<String> options = Arrays.asList(flag, outDir);JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);boolean result = task.call();if (result == true) {try {return Class.forName(className);} catch (ClassNotFoundException e) {e.printStackTrace();}}return null;}

上面的代码也是较为核心的部分 ,就是将我们的字符串转换成一个java类,然后编译成class 重点看call(),

call(): 此方法就是进行动态编译可执行的代码

编译完成后,会返回boolean  为true表示编译成功,反之则, 或者 error : java.lang.illegalstateexception' ....... 出现异常情况时,不要慌张,可能这时脑回路不正确,参考我的代码,比较一下自己的出处.

接下来我们得到编译完成的class , 成功后class已经加载到内存中了,我们这是只需要通过java的反射去找到该类文件并执行它就好了

 private Object run(String method,String codes){String className = "com.test.Eval";StringBuilder sb = new StringBuilder();sb.append("package com.test;");sb.append("\n public class Eval{\n ");sb.append(codes);sb.append("\n}");Class<?> clazz = compile(className, sb.toString());try {// 生成对象Object obj = clazz.newInstance();Class<? extends Object> cls = obj.getClass();// 调用main方法Method m = clazz.getMethod(method,String[].class);Object invoke = m.invoke(obj, new Object[] { new String[] {} });return invoke;} catch (Exception e) {e.printStackTrace();return null;}}

好了,代码完成,我们看一下执行结果

  public static Object eval() {Eval eval = mWeakReference.get();String method = "main";String codes = "public static void main(String[]args){" +"System.out.print(\"hello world\"); }";eval.run(method,codes);return null;}public static void main(String[] args) {eval();}

Java eval  demo 地址 : https://github.com/SunnyLive/JavaEval.git

JavaCompiler实战:将Java源代码字符串动态编译成java类相关推荐

  1. 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些

    目录 1 HotSpot VM的历史 2 HotSpot VM 概述 2.1 编译器 2.2 解释器 2.3 解释型语言 VS 编译型语言 3 动态编译 3.1 什么是动态编译 3.2 HotSpot ...

  2. 菜鸟学习笔记:Java提升篇12(Java动态性2——动态编译、javassist字节码操作)

    菜鸟学习笔记:Java提升篇12(Java动态性2--动态编译.javassist字节码操作) Java的动态编译 通过脚本引擎执行代码 Java字节码操作 JAVAssist的简单使用 常用API ...

  3. 将DEX反编译成Java源代码

    本文翻译自:decompiling DEX into Java sourcecode 如何将Android DEX(VM字节码)文件反编译成相应的Java源代码? #1楼 参考:https://sta ...

  4. python源代码不需要编译成什么-python需要编译么

    一个经常听见的问题,那就是:Python是解释型的语言吗?它会被编译吗?这个问题没有想象中那么好回答.和很多人认识世界一样,习惯以一个简单的模型去评判一些事物.而事实上,里面包含了很多很多的细节. 通 ...

  5. xjc java_JDK Tools - xjc: 将 XML Schema 编译成 Java 类

    xjc 是 JAXB 将 xsd 生成 Java 类的工具. 命令格式 xjc [ options ] schema file/URL/dir/jar ... [-b bindinfo ] ... 命 ...

  6. Java的class文件批量反编译成Java文件

    Java的class文件批量反编译成java文件 Class文件是java文件编译后产生的一个文件,class文件便于在软件上运行,但是我们无法阅读中间的程序,所以我们需要将class文件转换成jav ...

  7. jar反编译成java工具

    在开发过程中,经常使用到jar包.有的jar是在ide不能查看源码的. 这时就可以使用到jar的反编译工具. 传送门: http://download.csdn.net/detail/wzp09tjl ...

  8. python源代码不需要编译成什么-python程序不需要编译吗

    python编译过程和执行原理 (1)python执行原理 这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的 机器语言,经过 ...

  9. 解析java源代码_一步步解析java执行内幕

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...

最新文章

  1. 栈和队列--算法设计题3.15
  2. 波士顿动力机器狗新技能!跳绳园艺做家务,还有书法神技
  3. python3.6安装pyltp_pyltp安装问题解决
  4. LOWORD或HIWORD宏得到的是一个无符号WORD类型的数
  5. 【每周CV论文】深度学习图像降噪应该从阅读哪些文章开始
  6. .NetCore从零开始使用Skywalking分布式追踪系统
  7. 算法 笔试的时候 如何输入元素?
  8. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern
  9. mysql -connector/j驱动下载
  10. 构建Python软件大厦系列
  11. Linux环境安装之Ant
  12. Linux服务器发包
  13. python 预编译加速_Python加速
  14. PLC编程与实践——基础实验
  15. swper实现分页器样式修改
  16. Python常用小技巧(三)——批量修改图片尺寸
  17. 什么是邮箱个人签名?邮箱如何设置个人签名?
  18. 网络编程--TCP/IP协议(二)
  19. linux磁盘分区题目,Linux练习例题(附答案)
  20. 拉马努金,天才之超越

热门文章

  1. 凡子谷机器人创客教育_机器人创客教育好处
  2. STM32F407-高级定时器输入捕获功能
  3. 工业无线路由器下智慧交通路况、违章、视频监控系统
  4. 武装突袭3服务端 linux,【武装突袭3】死亡国度模组 服务端+数据库 ARMA3:1.80(1.08) MOD:1.9.3 Server:1.9.0 [1/28]...
  5. Visual Studio 2017运行C语言项目
  6. mPaas-H5容器 如何将阿里特定H5容器打开的页面进行横屏?
  7. tortoisesvn 语言包1.9.7
  8. TP5 百度AI身份证识别
  9. 深圳IO —— 一个汇编编程小游戏
  10. 小兔鲜案例注册,登录,索引的实现效果