`
yutaozxy
  • 浏览: 68999 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java字节码动态编译

    博客分类:
  • jvm
 
阅读更多
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字节码时常用的工具。本文将详细介绍Java字节码反编译的概念、用途以及JAD和FrontEnd这两个关键工具。 首先,Java字节码是Java源代码经过编译器...

    java字节码文件反编译

    Java字节码文件反编译是一项重要的技术,它允许开发者查看和理解已编译的Java类文件(.class文件)内部的源代码结构。在Java中,源代码被编译成字节码,这是一种中间语言,由Java虚拟机(JVM)执行。然而,有时我们...

    Java字节码反编译

    Java字节码反编译是Java开发者在进行代码分析、逆向工程或学习类库源码时常用的一种技术。它允许我们将已经编译过的.class文件转换回可读性更强的.java源代码文件,以便理解程序的运行逻辑。在这个过程中,我们通常...

    XJad 字节码反编译工具

    在IT行业中,字节码反编译是一种技术,它允许我们查看和理解那些由编译器生成的中间语言代码,通常是Java字节码或.NET CLR字节码。这些字节码是不可读的机器语言,但通过反编译,我们可以将其转化为更易于人类理解的...

    java .net 反编译工具 字节码反编译

    Java和.NET平台都提供了各自的字节码语言,即Java字节码和.NET的MSIL(Microsoft Intermediate Language),它们是编译后的代码形式,对于源代码不可见。本文将详细探讨Java和.NET的反编译工具以及字节码反编译的...

    轻松看懂Java字节码.pdf

    Java字节码(Bytecode)是Java源代码编译后生成的指令集,它是一种与平台无关的中间表示形式,可以在任何安装了Java虚拟机(JVM)的设备上运行。这一点至关重要,因为它允许Java应用程序在多种不同的硬件和操作系统...

    JAVA字节码JAVA字节码.doc

    javap 可以将类文件(.class)中的字节码反编译成 Java 源代码的形式,打印出类中的公共域、方法、构造函数和静态初始值。 javap 的用法语法为:javap &lt;选项&gt; &lt;类名&gt;,其中选项包括: * -b:向后兼容 JDK 1.1 中的...

    java字节码分析工具

    Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...

    java字节码加密

    Java字节码加密是保护Java应用程序源代码安全的重要技术手段,主要是为了防止恶意用户逆向工程分析、篡改或盗取程序的核心逻辑。在Java中,字节码(Bytecode)是程序经过编译后的中间表示,可以直接由Java虚拟机...

    java字节码文件查看工具,查看class文件

    Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...

    java字节码编辑器

    Java字节码编辑器是一种工具,它允许开发者直接编辑Java程序编译后的`.class`文件,而不是反编译后再重新编译。这种编辑器对于理解、调试和优化Java代码非常有用,尤其是对于那些无法访问源代码或者需要进行底层操作...

    java字节码.docx

    Java 字节码是一种中间形式的代码,它是 Java 源代码编译后的结果。Java 字节码是平台独立的,可以在任何支持 Java 的设备上运行。Java 字节码的结构主要包括魔数、主版本号、次版本号、常量池、访问标识符、当前...

    字节码反编译软件稳定版

    字节码反编译软件如"字节码反编译软件稳定版",是开发者用来查看和理解Java字节码的工具,这对于调试、逆向工程以及学习Java虚拟机(JVM)的工作原理非常有用。以下将详细阐述字节码、反编译过程、jd-gui工具及其在...

    从一个class文件深入理解Java字节码结构

    通过深入了解这些结构,开发者可以更好地理解Java字节码的工作原理,从而优化代码执行效率,调试程序,甚至实现字节码级别的动态修改和插桩技术。这对于性能调优、AOP(面向切面编程)以及理解JVM的工作方式至关重要...

    反编译 Java 字节码的工具

    总的来说,反编译Java字节码是一项重要的技术,它为开发者提供了查看和理解二进制代码的能力。通过使用像`jad.exe`这样的工具,我们可以深入探究Java程序的内部运作,从而促进学习、调试和代码优化。然而,要注意的...

    Java 字节码简单说明.zip

    理解Java字节码有助于优化程序性能,例如,通过查看字节码可以分析方法的调用频率,为JIT编译提供依据;或者通过修改字节码实现代码注入,进行调试或增强功能。 总的来说,Java字节码是Java平台的核心组成部分,它...

    JAVA字节码操作库 BCEL

    1. **字节码**:Java字节码是Java虚拟机(JVM)运行的二进制代码,它由javac编译器将源代码编译成。每个类都有一个`.class`文件,其中包含了该类的字节码。 2. **API组件**:BCEL包含一系列接口和类,如`ClassGen`,...

Global site tag (gtag.js) - Google Analytics