源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java 将字符串动态生成字节码的实现方法

  • 时间:2022-07-29 18:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java 将字符串动态生成字节码的实现方法
可以生成可执行的class文件 直接上能执行代码:
[u]复制代码[/u] 代码如下:
public class Test { /**   * @param args   */ @SuppressWarnings("static-access") public static void main(String[] args) {   try {    new Test().calculate("234 - ( 1 + 45 * 4 ) / 5");   } catch (Exception e) {    e.printStackTrace();   } } private static double calculate(String expr) throws Exception {   String className = "CalculatorMain";   String methodName = "calculate";   String source = "class " + className     + " { public static void main(String[] args){System.out.println(calculate());} public static double " + methodName + "() { return "     + expr + "; } }";   JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();   StandardJavaFileManager fileManager = compiler.getStandardFileManager(     null, null, null);   StringSourceJavaObject sourceObject = new Test.StringSourceJavaObject(     "Main", source);   Iterable<? extends JavaFileObject> fileObjects = Arrays     .asList(sourceObject);   CompilationTask task = compiler.getTask(null, fileManager, null, null,     null, fileObjects);   boolean result = task.call();   if (result) {    ClassLoader loader = Thread.currentThread().getClass()      .getClassLoader();    try {     Class<?> clazz = loader.loadClass(className);     Method method = clazz.getMethod(methodName, new Class<?>[] {});     Object value = method.invoke(null, new Object[] {});     return (Double)value;    } catch (Exception e) {     // throw new CalculationException("内部错误。");    }   } else {    // / new CalculationException("错误的表达式。");   }   return 0; } static class StringSourceJavaObject extends SimpleJavaFileObject {   private String content = null;   public StringSourceJavaObject(String name, String content)     throws URISyntaxException {    super(URI.create("string:///" + name.replace('.', '/')      + Kind.SOURCE.extension), Kind.SOURCE);    this.content = content;   }   public CharSequence getCharContent(boolean ignoreEncodingErrors)     throws IOException {    return content;   } } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部