Java 将字符串动态生成字节码的实现方法
动态代码生成在运行的时候就能生成可执行代码,同事也可用于优化各种程序,爱站技术频道小编为大家介绍Java 将字符串动态生成字节码的实现方法,并给出了一个实例。
可以生成可执行的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;
}
}
}
以上就是Java 将字符串动态生成字节码的实现方法,程序不仅仅需要专业的知识,还需要多年的丰富经验,有了这两点,相信你的编程之路会平顺很多,专业知识的学习可以来爱站技术频道哦!