Java将指定的字符串编译Class对象执行,程序主要使用了JDK提供的Tools.jar工具实现,如果没有Tools.jar要将jdk的lib中的tools.jar复制到jre的lib中。
package junit.test; import java.io.File; import java.lang.reflect.Method; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import javax.tools.JavaCompiler.CompilationTask; import javax.tools.JavaFileObject.Kind; public class JavaToolsTest { public static void executeMain(String name, String content){ Class<?> claszz = compile(name,content); try { Method method = claszz.getMethod("main", String[].class); System.out.println(method.getName()); method.invoke(null, new Object[] { new String[] {} }); } catch (Exception e) { e.printStackTrace(); } } private final static Class<?> compile(String name, String content) { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); StrSrcJavaObject srcObject = new StrSrcJavaObject(name, content); Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(srcObject); String flag = "-d"; String outDir = ""; try { File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI()); outDir = classPath.getAbsolutePath() + File.separator; } catch (URISyntaxException e1) { e1.printStackTrace(); } Iterable<String> options = Arrays.asList(flag, outDir); CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects); boolean result = task.call(); if (result == true) { System.out.println("Compile it successfully."); try { return Class.forName(name); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return null; } private static class StrSrcJavaObject extends SimpleJavaFileObject { private String content; public StrSrcJavaObject(String name, String content) { super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); this.content = content; } public CharSequence getCharContent(boolean ignoreEncodingErrors) { return content; } } public static void main(String[] args) throws Exception{ StringBuffer sb = new StringBuffer(); sb.append("package junit.test;"); sb.append("public class Test1{"); sb.append(" public static void main(String[] args){"); sb.append(" System.out.println(\"ok.\");"); sb.append(" }"); sb.append("}"); executeMain("junit.test.Test1", sb.toString()); } }
相关推荐
在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...
确保Java环境已配置好,并且`ReplaceStr`类已经正确编译为`ReplaceStr.class`,这两个脚本就可以用来调用Java的字符串替换工具。 需要注意的是,如果要在多个文件中进行批量替换,你可能需要将上述代码封装到一个...
实验结果证明了 Java 中数组和字符串的概念和使用,例如使用 Math 类生成随机数、数组和字符串的概念、String 类和 StringBuffer 类创建字符串对象的区别等。同时,实验还展示了使用 Java 编程语言来实现实际应用中...
### Java连接数据库字符串详解 #### 一、JDBC概述与加载驱动 在Java开发中,JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类...
对于C#开发者,虽然没有内置的`eval`函数,但可以借助Roslyn编译器API将字符串编译为.NET的IL(中间语言)代码,然后执行。例如: ```csharp using System; using Microsoft.CSharp; using Microsoft.CodeAnalysis;...
用java实现的递归下降文法 将JSon字符串转换成Java对象 为了简单化 忽略了很多情况 仅仅作为初接触编译原理的同学们共勉 User对象有一个Teacher对象 Teacher里有一个Book对象 等等 比如 User user User json User ...
本文将详细介绍如何使用Java正则表达式进行字符串替换,并通过具体的代码示例来展示其实现过程。 #### 二、基础知识 ##### 1. 正则表达式简介 正则表达式(Regular Expression),通常被简称为regex或regexp,是一...
总之,Java Class文件是Java程序执行的关键,通过编译过程将源代码转化为JVM能理解的二进制格式。了解其结构和编译原理对于优化代码和调试问题都十分有益。使用像jclasslib这样的工具,我们可以直观地查看和分析...
本文将详细探讨一个能够自动输出指定字符串的简单Java程序,分析它的实现原理,以及如何从源码到可执行jar文件的转变过程。 ### 程序功能简介 这个名为“自动输出指定字符串的程序”是一个基础的Java应用程序,其...
接着,它将源代码字符串转换为`JavaFileObject`,并调用`compiler.compile`方法进行编译。最后,记得关闭文件管理器以释放资源。 编译完成后,我们可能需要将生成的`.class`文件打包成JAR文件。这可以通过使用`jar`...
对于源代码文件,如`Test.java`和`Grp.java`,搜索过程可能会涉及到编译和反编译步骤,因为原始的源代码字符串可能在编译后的字节码中无法直接找到。在这种情况下,可能需要使用Java的反编译库,如JAD,先将字节码...
-8 - 将Unicode字符转换为ANSI字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。 最常用的反编译指令如下所示: Jad –d c:\\javasource –s .java -8 javatest.class 这条指令将当前目录下的...
在Java编程中,将文本内容中的符合URL格式的字符串转换为超链接是一项常见的需求,特别是在处理用户生成内容或网络爬虫应用中。本教程将详细讲解如何使用Java实现这一功能,主要涉及URL正则表达式匹配和字符串处理...
解析Java中的String对象的数据类型字符串 Java中的String对象是一种特殊的数据类型,它不同于基本数据类型,也不同于其他对象。String对象的默认值是null,但它又是一种特殊的对象,有其它对象没有的一些特性。 ...
### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...
然后,我们编译这个正则表达式并创建一个`Matcher`对象,用于在输入字符串中查找匹配项。通过调用`matcher.find()`,我们可以遍历字符串中所有匹配的数字,并使用`matcher.group()`获取当前匹配的数字。 此外,我们...
描述中的“反编译后的汉字unicode显示格式转换为字符格式的代码”意味着在反编译过程中,可能会遇到汉字以Unicode编码形式出现,这通常是由于Java字节码中存储字符串的方式决定的。Unicode编码虽然通用,但在直接...
Java class文件和jar文件是Java程序的二进制表示形式,它们包含了编译后的字节码,用于JVM(Java虚拟机)执行。在开发和调试过程中,有时我们需要查看源代码,但原始的.java源文件可能丢失或者不可用。这时,反编译...
在下面的示例代码中,我们使用 Pattern.compile() 方法来编译正则表达式,然后使用 Matcher 对象的 replaceAll() 方法来替换字符串中的无用字符。 ```java public class StringUtil { public static void ...
Java反编译工具是开发者和逆向工程人员用于查看和理解Java字节码的软件,这些字节码是由Java编译器将源代码编译成的。标题提到的"java反编译工具直接打开class文件",指的是可以直接查看并转换为源代码形式的Java类...