国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java 將字符串動態生成字節碼的實現方法

2019-11-26 15:49:12
字體:
來源:轉載
供稿:網友

可以生成可執行的class文件

直接上能執行代碼:

復制代碼 代碼如下:

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;
  }
}

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长宁区| 泰宁县| 彩票| 榆林市| 南开区| 石景山区| 肥西县| 华宁县| 颍上县| 长白| 康平县| 喀喇沁旗| 吉林省| 津南区| 五指山市| 甘肃省| 南召县| 长春市| 芦山县| 库伦旗| 乐至县| 麟游县| 平安县| 杭州市| 黔西县| 新营市| 浦城县| 栾川县| 九龙县| 镇康县| 岚皋县| 德惠市| 宁武县| 抚松县| 乐至县| 调兵山市| 东至县| 宿松县| 新建县| 勃利县| 乐陵市|