Java 將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法
可以生成可執(zhí)行的class文件
直接上能執(zhí)行代碼:
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字節(jié)碼指令,成為技術大佬
- Java之字節(jié)碼以及優(yōu)勢案例講解
- Java字節(jié)碼增強技術知識點詳解
- 詳解Java動態(tài)字節(jié)碼技術
- 詳解Java字節(jié)碼編程之非常好用的javassist
- 淺談javap命令拆解字節(jié)碼文件
- Java字節(jié)碼中jvm實例用法
- Javassist如何操作Java 字節(jié)碼
- Java中invokedynamic字節(jié)碼指令問題
- java獲取版本號及字節(jié)碼編譯版本方法示例
- java 獲取字節(jié)碼文件的幾種方法總結
- java 中如何獲取字節(jié)碼文件的相關內容
- java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
- java字節(jié)碼框架ASM的深入學習
- 通過java字節(jié)碼分析學習對象初始化順序
- Java字節(jié)碼的增強技術
相關文章
透過Spring源碼查看Bean的命名轉換規(guī)則圖文詳解
Java Bean是一種 Java 編程語言編寫的可重用軟件組件,包括符合一定規(guī)范的Java 類、屬性和方法,用于描述和處理應用程序中的數(shù)據對象,下面這篇文章主要給大家介紹了關于透過Spring源碼查看Bean的命名轉換規(guī)則的相關資料,需要的朋友可以參考下2023-06-06SpringSecurity?Web權限方案實現(xiàn)全過程
Spring Security是一個功能強大且高度可定制的身份驗證和授權框架,專門用于保護Java應用程序的Web集成,下面這篇文章主要給大家介紹了關于SpringSecurity?Web權限方案實現(xiàn)的相關資料,需要的朋友可以參考下2024-01-01Spring獲取當前類在容器中的beanname實現(xiàn)思路
這篇文章主要介紹了Spring獲取當前類在容器中的beanname,實現(xiàn)思路只需繼承BeanNameAware接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07SpringBoot升級3.2報錯Invalid value type for
這篇文章給大家介紹了SpringBoot升級3.2報錯Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案,文中有詳細的原因分析,需要的朋友可以參考下2023-12-12