java运行string里面的代码
时间: 2023-11-26 10:03:35 浏览: 90
在 Java 中可以通过动态编译和执行的方式来运行字符串里面的代码。下面是一个简单的示例,可以通过字符串执行 Java 代码:
```java
import java.io.StringReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
public class DynamicCodeSnippet {
public static void main(String[] args) throws Exception {
// Java 代码字符串
String code = "public class MyClass { public void sayHello() { System.out.println(\"Hello, World!\"); } }";
// 编译 Java 代码字符串
Class<?> compiledClass = compileString("MyClass", code);
// 创建新对象
Object myObject = compiledClass.newInstance();
// 调用方法
Method method = compiledClass.getDeclaredMethod("sayHello");
method.invoke(myObject);
}
public static Class<?> compileString(String className, String code) throws Exception {
// 创建 Java 文件对象
JavaFileObject javaFile = new StringJavaFileObject(className, code);
// 获取编译器
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// 创建 Class 文件存储列表
List<JavaFileObject> fileList = new ArrayList<>();
fileList.add(javaFile);
// 编译 Java 文件
compiler.getTask(null, null, null, null, null, fileList).call();
// 加载编译后的 Class 文件
return Class.forName(className);
}
public static class StringJavaFileObject extends SimpleJavaFileObject {
private String code;
public StringJavaFileObject(String name, String code) {
super(URI.create("string:///" + name.replaceAll("\\.", "/") + Kind.SOURCE.extension), Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
}
```
这个代码片段中,我们首先使用字符串定义一个 Java 类,然后使用 `compileString` 方法将其编译为 Class 文件。接着我们使用反射 API 创建一个新对象,并调用其方法。注意,这个示例中的 `StringJavaFileObject` 类是一个自定义的 `JavaFileObject` 实现,用于从字符串中获取 Java 代码内容。
阅读全文