1、ant javac 的原理
sun.tools包下包含了很多命令的java实现,javac的使用见下例:
//sun.tools.javac.Main 该类负责实现javac命令,推荐使用反射方式创建该类实例(ant中就是用的反射)。
sun.tools.javac.Main compiler =
new sun.tools.javac.Main(System.err, "javac");
//编译后的class文件保存的地址
File dest=new File("classes");
dest.mkdir();
//开始编译,参数是执行javac命令是后面所根的参数,注意javac命令后参数以空格分隔,在此使用一个字符串数组保存。
compiler.compile(new String[]{"-classpath",".","-sourcepath",new File("temp").getAbsolutePath(),"-d","classes",""});
2、动态加载类
通过上面的方法动态的编译java类,在程序中使用的时候还需要进行加载。
所有的java类都是通过ClassLoader的对象来加载。在此可以使用其子类URLClassLoader加载:
//使用当前项目的路径为根路径
File baseDir=new File("");
URL url=new URL("file:/"+baseDir.getAbsolutePath()+"/classes/");
//通过指定class文件的路径告诉ClassLoader从何加载类
URLClassLoader loader=URLClassLoader.newInstance(new URL[]{url},ClassLoader.getSystemClassLoader());
//加载类,返回该类得Class实例。效果同Class.forName()。
clazz=loader.loadClass("org.jigger.Simple");
注意:使用自定义ClassLoader,无法使用Class.forName获取类对象,即无法使用系统类加载器加载该类
分享到:
相关推荐
在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...
通过自定义ClassLoader和利用`JavaCompiler` API,我们可以实现Java源文件的动态编译和加载,从而实现程序运行时的灵活扩展。在实际应用中,我们需要注意类加载的性能影响,以及类加载器之间的隔离问题,以确保系统...
在Java编程中,动态编译和运行类是一项重要的技术,特别是在需要实时更新代码或实现热部署的场景下。本文将详细讲解如何在Java中实现动态编译.java源代码文件并执行编译后的类。 首先,我们需要理解Java的编译过程...
在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...
此外,Classpath变量用于指定Java加载类库的位置,包括当前目录(用"."表示)和上一级目录(用".."表示)。如果未设置Classpath,Java会默认搜索当前目录。 Java与C/C++相比,具有显著优势。C/C++需要程序员手动...
在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...
6. **运行编译后的类**:如果编译成功,我们可以使用`ClassLoader`加载新生成的类并实例化。注意,类加载器应指向编译输出的目录。 ```java URLClassLoader classLoader = new URLClassLoader(new URL[]{new File(...
总的来说,“编译和运行Java程序的小工具”是一个便捷的开发辅助软件,它通过集成编译和运行过程,使得Java开发变得更加轻松快捷。无论是新手学习还是资深开发者快速测试,都能从中受益。如果你是Java开发者,不妨...
总结,Java程序的编译、加载与执行是一个复杂而高效的过程,涵盖了编译器、JVM、类加载器、解释器、垃圾收集器等多个组件的协同工作。理解这一过程对于优化Java应用程序的性能和解决运行时问题至关重要。
总结来说,Java的动态编译涉及使用`JavaCompiler`接口和`StandardJavaFileManager`来调用Javac,以及在运行时加载和实例化新生成的类。这个功能为开发者提供了更大的灵活性,可以在运行时根据需求编译和执行代码。在...
*1.创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 ...创建DynamicClassLoader来加载类 ,defineClass这个方法
运行路径是指Java虚拟机(JVM)在运行时查找并加载类文件的路径。当执行`java`命令时,JVM会遍历类路径中的所有目录和JAR文件来寻找所需的类。 在直接运行一个类(如`java HelloWorld`)时,JVM会从当前目录(".")...
"解决 Java 编译成功后运行 Class 文件出现“找不到或无法加载主类”的问题" 在 Java 开发中,经常会遇到一个问题,即 javac 编译成功后,用 java 运行 Class 文件却出现“找不到或无法加载主类”的错误信息。这种...
总的来说,JD-GUI作为一款强大的Java反编译工具,为开发者提供了一种有效的方式来探索和学习已编译的Java代码,帮助他们解决问题、提高代码理解力,从而提升开发效率。无论你是初学者还是经验丰富的开发者,JD-GUI都...
Java动态编译指的是在程序运行时将Java源代码编译为字节码并加载到Java虚拟机(JVM)中的过程。这种技术在许多场景下非常有用,例如在开发环境中进行快速迭代、AOP(面向切面编程)或运行时代码生成等。Java的`javax...
在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...
`Class.forName()`用于加载类,`Class.newInstance()`创建类的实例,`Method`和`Constructor`类则用于访问和调用类的方法和构造器。 在实际应用中,动态生成、编译和运行Java代码的示例包括: 1. **元编程**:例如...
其次,"Java运行时监控,第2部分 编译后插装和性能监控"涉及到动态编译和AOP(面向切面编程)技术。编译后插装是一种在程序运行时动态插入监控代码的技术,例如使用ASM或ByteBuddy库。这种技术可以无侵入地收集代码...
传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。然而,在开发过程中,我们可能希望在不重启应用的情况下,对已加载的...