`
wingware
  • 浏览: 142195 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

动态编译、加载类

阅读更多
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语言-动态编译代码并热加载类,js热加载

    动态编译、加载java类

    一个动态编译,加载Java类的演示。适用如动态编写算法等情况。

    JDK8 下 SpringBoot 应用动态编译 Java 源码并注入 Spring 容器

    基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...

    Java类动态加载(一)——java源文件动态编译为class文件

    NULL 博文链接:https://zheng12tian.iteye.com/blog/1488813

    Java动态编译Java代码,运行在内存中,并执行

    *1.创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 ...创建DynamicClassLoader来加载类 ,defineClass这个方法

    Java6内存中动态编译案例

    java6提供标准包javax.tools操作Java编译器,本例实现在内存动态编译java代码,并加载动态生成类 执行 console: public class HelloWorld { public static void main(String args[]) { System.out.println("Hello...

    springboot+java类热加载

    springboot 、java类热加载、jarinjar、动态编译、自动引用依赖

    Jdk 动态编译 Java 源码测试 Demo

    通过 Jdk 工具类,直接将 Java 源码编译为 Class 字节码,并可加载为 Class 对象; 实例化后,可调用实例对象的方法 通过上面的实现,可以在线动态修改源码,并触发编译,加载到线上项目内,实现类似于热 部署的...

    内存中动态编译执行java代码

    不需要任何java类文件,将字符串输入到内存,然后编译,加载,执行,整个过程全部在内存中实现,不会产生.java和.class文件,做到了洁净无污染。

    C# 动态编译、动态执行、动态调试

    在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 如上图,我封装的类CSharpProvider很...

    热加载类工具

    动态重新加载改变的类而不用重启 JVM ,对于大型软件来说开发程序重启是非常耗时的,开发时新建类,在已有的类中添加方法是无法加载上的,大家应该经常碰到ECLIPSE中由于添加方法编译后弹出的警告,此时如果需要调试...

    JUN SpringBoot API Service 是一个基于SpringBoot+Groovy+SQL动态生成API

    支持动态注册Mapping,动态生成类及源码并动态编译生成Bean,可动态生成HTTP接口。支持在线编辑写好SQL或者Java源码、Groovy源码、Python源码(TODO),JavaScript源码(TODO)、Shell脚本,后即可快速生成Rest接口...

    Java类文件加密保护,防止反编译

    其实,Java也是可以对类文件进行加密,然后由JVM直接加载的,加密方法可以选用高强度的算法,然后中间不经过任何转换,由JVM直接加载,在JVM中进行解密并加载类,这样就能有效避免类文件暴露从而被破解的问题。

    DynamicJavaCompiler:动态编译类

    动态Java编译器即时编译/加载类代码生成器动态编译和加载的示例使用: // generate implementation for a known interfaceString className = " package.GenedDummyImpl "String code = ...// Compile and load ...

    Java虚拟机JVM类加载初始化

    3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再...

    数据库动态加载匿名对象

    5 编译为委托 执行速度在字段多 数据量上10W以上 选用 IDataReader 对象加载 比加载原生 DataTable 还快 6 常规类型只会加载每一个字段 不区分名称 7 对象的属性若为类对象 也会检查并加载 除非递归引用会自动...

    安卓一键反编译回编译apk+jar格式工具 带演示图

    系统类的需要加载系统框架编译。对与有壳的app。需要自行去壳后才可以。 4---需要一定动手能力较强的友友操作使用 5---资源下载后解压然后改名英文短路径在操作。避免有些电脑系统不识别中文路径

    类加载器和双亲委派模型加载类、类的加载优先级的详解.docx

    加载就是将字节码的二进制流转化为 方法区 的运行时数据结构,并生成类所对象的Class对象,字节码二进制流可以是我们编译后的class文件,也可以从网络中获取,或者运行时动态生成(动态代理)等等。 那什么时候会...

    Java动态生成代码并编译载入.pdf

    有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。

    JAVA类加载

    Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 .class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 ...

Global site tag (gtag.js) - Google Analytics