`

Java将指定的字符串编译Class对象执行

    博客分类:
  • java
阅读更多

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

 

0
4
分享到:
评论

相关推荐

    动态编译字符串成java,并且添加class到jvm

    在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...

    java 文本字符串替换工具

    确保Java环境已配置好,并且`ReplaceStr`类已经正确编译为`ReplaceStr.class`,这两个脚本就可以用来调用Java的字符串替换工具。 需要注意的是,如果要在多个文件中进行批量替换,你可能需要将上述代码封装到一个...

    实验9:Java数组与字符串.doc

    实验结果证明了 Java 中数组和字符串的概念和使用,例如使用 Math 类生成随机数、数组和字符串的概念、String 类和 StringBuffer 类创建字符串对象的区别等。同时,实验还展示了使用 Java 编程语言来实现实际应用中...

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

    递归下降文法-Json字符串转换成Java对象

    用java实现的递归下降文法 将JSon字符串转换成Java对象 为了简单化 忽略了很多情况 仅仅作为初接触编译原理的同学们共勉 User对象有一个Teacher对象 Teacher里有一个Book对象 等等 比如 User user User json User ...

    java正则表达式替换字符串

    本文将详细介绍如何使用Java正则表达式进行字符串替换,并通过具体的代码示例来展示其实现过程。 #### 二、基础知识 ##### 1. 正则表达式简介 正则表达式(Regular Expression),通常被简称为regex或regexp,是一...

    java class文件编译

    总之,Java Class文件是Java程序执行的关键,通过编译过程将源代码转化为JVM能理解的二进制格式。了解其结构和编译原理对于优化代码和调试问题都十分有益。使用像jclasslib这样的工具,我们可以直观地查看和分析...

    自动输出指定字符串的程序(还不是特别完善,仅支持英文大小字符)(Class文件,java源码,jar文件)

    标题中的“自动输出指定字符串的程序”是一个简单的Java应用程序,它的功能是接收用户输入的特定字符串,并在控制台中自动打印出来。这个程序可能是一个学习示例,用于教授基础的输入输出操作。不过,根据描述,它...

    java动态编译指定java文件且将java文件生成jar

    接着,它将源代码字符串转换为`JavaFileObject`,并调用`compiler.compile`方法进行编译。最后,记得关闭文件管理器以释放资源。 编译完成后,我们可能需要将生成的`.class`文件打包成JAR文件。这可以通过使用`jar`...

    查找含指定字符串的文件

    对于源代码文件,如`Test.java`和`Grp.java`,搜索过程可能会涉及到编译和反编译步骤,因为原始的源代码字符串可能在编译后的字节码中无法直接找到。在这种情况下,可能需要使用Java的反编译库,如JAD,先将字节码...

    java反编译工具 jad

    -8 - 将Unicode字符转换为ANSI字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。 最常用的反编译指令如下所示: Jad –d c:\\javasource –s .java -8 javatest.class 这条指令将当前目录下的...

    将内容中的符合url格式的字符串转换为超链接(JAVA版)

    在Java编程中,将文本内容中的符合URL格式的字符串转换为超链接是一项常见的需求,特别是在处理用户生成内容或网络爬虫应用中。本教程将详细讲解如何使用Java实现这一功能,主要涉及URL正则表达式匹配和字符串处理...

    解析Java中的String对象的数据类型 字符串

    解析Java中的String对象的数据类型字符串 Java中的String对象是一种特殊的数据类型,它不同于基本数据类型,也不同于其他对象。String对象的默认值是null,但它又是一种特殊的对象,有其它对象没有的一些特性。 ...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    java获取字符串内全部数字

    然后,我们编译这个正则表达式并创建一个`Matcher`对象,用于在输入字符串中查找匹配项。通过调用`matcher.find()`,我们可以遍历字符串中所有匹配的数字,并使用`matcher.group()`获取当前匹配的数字。 此外,我们...

    JAVA反编译和unicode转字符.rar

    描述中的“反编译后的汉字unicode显示格式转换为字符格式的代码”意味着在反编译过程中,可能会遇到汉字以Unicode编码形式出现,这通常是由于Java字节码中存储字符串的方式决定的。Unicode编码虽然通用,但在直接...

    java class文件或jar文件反编译工具.rar

    Java class文件和jar文件是Java程序的二进制表示形式,它们包含了编译后的字节码,用于JVM(Java虚拟机)执行。在开发和调试过程中,有时我们需要查看源代码,但原始的.java源文件可能丢失或者不可用。这时,反编译...

    java去除字符串中的空格、回车、换行符、制表符.pdf

    在下面的示例代码中,我们使用 Pattern.compile() 方法来编译正则表达式,然后使用 Matcher 对象的 replaceAll() 方法来替换字符串中的无用字符。 ```java public class StringUtil { public static void ...

    java反编译工具直接打开class文件

    Java反编译工具是开发者和逆向工程人员用于查看和理解Java字节码的软件,这些字节码是由Java编译器将源代码编译成的。标题提到的"java反编译工具直接打开class文件",指的是可以直接查看并转换为源代码形式的Java类...

Global site tag (gtag.js) - Google Analytics