package com.compiler;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Locale;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticListener;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class CompilerTest {
public static void main(String[] args) throws Exception {
String fileToCompile = "src" +File.separator + "com" + File.separator + "MoreErrors.java";//使用需要编译的class文件的路径来加载要编译的文件
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//得到java底层提供的编译器
StandardJavaFileManager fileManager = compiler.getStandardFileManager(new MyDiagnosticListener(), null, null);//得到标准的java文件管理器
// Iterable< ? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjectsFromStrings(Arrays.asList(fileToCompile));
Iterable< ? extends JavaFileObject> fileObjects = Arrays.asList(new StringSourceJavaObject());//生产java文件对象
CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);//通过java编译器得到需要编译的任务
boolean result = task.call();
if (result) {
// Class cl = CompilerTest.class.getClassLoader().loadClass("com.MoreErrors");
System.out.println("编译成功。");
// Object m = cl.newInstance();
// Method method = cl.getMethod("errorTwo", new Class<?>[] {});
// method.invoke(m, new Object[] {});
}
}
/**
* 这个类用于简化得到java字节码的内容可以让我们从任意地方得到需要编译的字节码内容
* @author Administrator
*
*/
static class StringSourceJavaObject extends SimpleJavaFileObject {
StringBuilder javaFileContents = new StringBuilder("" +
"class TestClass{" +
" public void testMethod(){" +
" System.out.println(" + "\"test\"" + ");" +
"}" +
"}");
public StringSourceJavaObject() throws URISyntaxException {
super(new URI("TestClass"), Kind.SOURCE);
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return javaFileContents.toString();
}
}
}
/**
* 在java字节文件编译过程中如果出现错误会自动地用该类报告错误
* @author YUTAO
*/
class MyDiagnosticListener implements DiagnosticListener{
public void report(Diagnostic diagnostic) {
System.out.println("Code->" + diagnostic.getCode());
System.out.println("Column Number->" + diagnostic.getColumnNumber());
System.out.println("End Position->" + diagnostic.getEndPosition());
System.out.println("Kind->" + diagnostic.getKind());
System.out.println("Line Number->" + diagnostic.getLineNumber());
System.out.println("Message->"+ diagnostic.getMessage(Locale.ENGLISH));
System.out.println("Position->" + diagnostic.getPosition());
System.out.println("Source" + diagnostic.getSource());
System.out.println("Start Position->" + diagnostic.getStartPosition());
System.out.println("\n");
}
}
相关推荐
Java字节码反编译工具是开发者在进行代码分析、逆向工程或学习Java字节码时常用的工具。本文将详细介绍Java字节码反编译的概念、用途以及JAD和FrontEnd这两个关键工具。 首先,Java字节码是Java源代码经过编译器...
Java字节码文件反编译是一项重要的技术,它允许开发者查看和理解已编译的Java类文件(.class文件)内部的源代码结构。在Java中,源代码被编译成字节码,这是一种中间语言,由Java虚拟机(JVM)执行。然而,有时我们...
Java字节码反编译是Java开发者在进行代码分析、逆向工程或学习类库源码时常用的一种技术。它允许我们将已经编译过的.class文件转换回可读性更强的.java源代码文件,以便理解程序的运行逻辑。在这个过程中,我们通常...
在IT行业中,字节码反编译是一种技术,它允许我们查看和理解那些由编译器生成的中间语言代码,通常是Java字节码或.NET CLR字节码。这些字节码是不可读的机器语言,但通过反编译,我们可以将其转化为更易于人类理解的...
Java和.NET平台都提供了各自的字节码语言,即Java字节码和.NET的MSIL(Microsoft Intermediate Language),它们是编译后的代码形式,对于源代码不可见。本文将详细探讨Java和.NET的反编译工具以及字节码反编译的...
Java字节码(Bytecode)是Java源代码编译后生成的指令集,它是一种与平台无关的中间表示形式,可以在任何安装了Java虚拟机(JVM)的设备上运行。这一点至关重要,因为它允许Java应用程序在多种不同的硬件和操作系统...
javap 可以将类文件(.class)中的字节码反编译成 Java 源代码的形式,打印出类中的公共域、方法、构造函数和静态初始值。 javap 的用法语法为:javap <选项> <类名>,其中选项包括: * -b:向后兼容 JDK 1.1 中的...
Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...
Java字节码加密是保护Java应用程序源代码安全的重要技术手段,主要是为了防止恶意用户逆向工程分析、篡改或盗取程序的核心逻辑。在Java中,字节码(Bytecode)是程序经过编译后的中间表示,可以直接由Java虚拟机...
Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...
Java字节码编辑器是一种工具,它允许开发者直接编辑Java程序编译后的`.class`文件,而不是反编译后再重新编译。这种编辑器对于理解、调试和优化Java代码非常有用,尤其是对于那些无法访问源代码或者需要进行底层操作...
Java 字节码是一种中间形式的代码,它是 Java 源代码编译后的结果。Java 字节码是平台独立的,可以在任何支持 Java 的设备上运行。Java 字节码的结构主要包括魔数、主版本号、次版本号、常量池、访问标识符、当前...
字节码反编译软件如"字节码反编译软件稳定版",是开发者用来查看和理解Java字节码的工具,这对于调试、逆向工程以及学习Java虚拟机(JVM)的工作原理非常有用。以下将详细阐述字节码、反编译过程、jd-gui工具及其在...
通过深入了解这些结构,开发者可以更好地理解Java字节码的工作原理,从而优化代码执行效率,调试程序,甚至实现字节码级别的动态修改和插桩技术。这对于性能调优、AOP(面向切面编程)以及理解JVM的工作方式至关重要...
总的来说,反编译Java字节码是一项重要的技术,它为开发者提供了查看和理解二进制代码的能力。通过使用像`jad.exe`这样的工具,我们可以深入探究Java程序的内部运作,从而促进学习、调试和代码优化。然而,要注意的...
理解Java字节码有助于优化程序性能,例如,通过查看字节码可以分析方法的调用频率,为JIT编译提供依据;或者通过修改字节码实现代码注入,进行调试或增强功能。 总的来说,Java字节码是Java平台的核心组成部分,它...
1. **字节码**:Java字节码是Java虚拟机(JVM)运行的二进制代码,它由javac编译器将源代码编译成。每个类都有一个`.class`文件,其中包含了该类的字节码。 2. **API组件**:BCEL包含一系列接口和类,如`ClassGen`,...