package com.crnielsen.tag;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Arrays;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class Test {
public static void main(String args[]) throws Exception {
Runtime run = Runtime.getRuntime();
eval("test....fuck.....");
}
public static void eval(String str) {
// System.out.println(System.getProperty("user.dir"));
String packageName = "cn.wingware";
String className = "Temp";
String s = "package "+packageName+";public class "+className+"{";
s += "public String call(StringBuffer ss){";
s += "System.out.println(\">>>\"+ss);";
s += "return \"sdfsf>>>>>>>>>>>>>>>>>\"+ss.getClass()+\"<<<>>>\"+ss.toString();";
s += "}}";
java.io.File f = new java.io.File("d:\\"+className+".java");
try {
PrintWriter pw = new PrintWriter(f);
pw.println(s);
pw.close();
// 动态编译
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector diagnostics = new DiagnosticCollector();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList(f.getAbsolutePath()));
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
boolean success = task.call();
fileManager.close();
System.out.println((success) ? "编译成功" : "编译失败");
} catch (Exception e) {
System.out.println("编译错误!");
e.printStackTrace();
}
try {
WingwareClassLoader loader = new WingwareClassLoader();
System.out.println("###"+loader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bs = new byte[1024];
InputStream in = new FileInputStream("d:\\"+className+".class");
int length;
while((length=in.read(bs))!=-1){
baos.write(bs, 0, length);
}
baos.flush();
in.close();
bs = baos.toByteArray();
Class<?> cls = loader.loadClass(packageName+"."+className, bs);
Object obj = cls.newInstance();
// 映射call方法
Method call = cls.getMethod("call",StringBuffer.class);
// 执行call方法
System.out.println("返回内容:"+call.invoke(obj,new StringBuffer(str)));
} catch (Exception e) {
e.printStackTrace();
System.out.println("运行错误!");
}
}
}
class WingwareClassLoader extends ClassLoader{
@SuppressWarnings( { "unchecked" })
public Class loadClass(String zlass, byte[] bs) throws IOException {
Class cNew = super.defineClass(zlass, bs, 0, bs.length);
return cNew;
}
}
分享到:
相关推荐
在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...
在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...
- **插件系统**:通过动态加载和执行编译后的插件代码,实现插件化架构,使应用具有可扩展性。 - **测试与调试**:在开发过程中,快速测试新的代码片段,无需每次都重新编译整个项目。 需要注意的是,动态编译带来...
在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...
在Java编程中,动态编译和运行类是一项重要的能力,特别是在需要实时更新代码或实现热部署的场景下。本文将深入探讨如何利用Java的API来动态编译.java源文件,并执行编译后的类。 首先,Java的`javac`命令行工具是...
但通过动态编译,我们可以让程序在运行时根据需要加载新的类。这种方式常用于实现热更新,即在不重启服务的情况下更新代码,提高了系统的灵活性和可用性。Java的`ClassLoader`类就是实现这一功能的关键,它可以按需...
Java动态编译加载代码分享知识点 Java动态编译加载代码分享是Java编程中的一种重要技术,能够动态编译加载Java代码,实现灵活的代码管理和执行。下面是相关的知识点: 1. JavaCompiler类:JavaCompiler类是Java...
在Java编程语言中,动态加载类机制是一种强大的功能,它允许程序在运行时根据需要加载新的类或资源,而不是在编译时确定所有类。这种技术对于提高软件的灵活性、可扩展性和模块化至关重要,特别是在大型系统和插件式...
*1.创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 ...创建DynamicClassLoader来加载类 ,defineClass这个方法
使用`Class.forName()`加载类后,可以调用`newInstance()`方法创建类的实例,然后调用其方法执行动态编译的代码。 以上步骤概括了动态编译字符串成Java并加载到JVM的过程。这个技术虽然强大,但也需要注意安全问题...
编译完成后,我们可以使用`ClassLoader`来动态加载并运行新编译的类。以下是如何加载并执行一个名为`MyClass`的类: ```java public static void runCompiledClass() throws Exception { URLClassLoader ...
在.NET框架中,C#语言提供了强大的动态编译能力,使得开发者可以在运行时将源代码字符串编译为可执行的程序集。这个过程通常涉及到System.CodeDom.Compiler命名空间中的类,如CodeDomProvider和CompilerResults等。...
1. 插件系统:动态编译可以在运行时加载和执行外部代码,实现插件式架构,让程序可以根据需要加载不同的功能模块。 2. 脚本引擎:游戏开发中,可以使用动态编译执行玩家自定义的脚本,增加游戏的可玩性和扩展性。 3....
JVM通过类加载器加载这些字节码,并由解释器将其转换为机器码执行。然而,这种解释执行模式在性能上不如直接执行机器码。 2. **即时编译(JIT)**: JIT编译器是JVM的一部分,它会在运行时监测代码的执行情况。...
5. **生成并加载类文件**:成功编译后,会产生`.class`文件,这个文件需要被加载到JVM中。Java的`ClassLoader`可以实现这一点,通常使用自定义的类加载器来加载动态生成的类。 6. **执行`main`方法**:一旦类被加载...
总结来说,Java的动态编译涉及使用`JavaCompiler`接口和`StandardJavaFileManager`来调用Javac,以及在运行时加载和实例化新生成的类。这个功能为开发者提供了更大的灵活性,可以在运行时根据需求编译和执行代码。在...
动态编译的概念主要是基于System.CodeDom.Compiler命名空间中的类,如CodeDomProvider和CompilerParameters等。这个功能在处理一些特定场景,如自定义插件系统、运行时代码生成或者对未知代码进行编译执行时非常有用...
我们可以通过重写`getClassLoader()`方法来实现自己的类加载逻辑,以便在运行时加载并执行这些动态编译的类。 最后,一旦编译成功,我们就可以通过`ClassLoader`来加载并实例化这个动态编译的类,然后执行它的方法...