今天总结了一下.动态执行java代码比较好的有ognl(只能计算表达示),javassist更改class文件方式实现
package com.henglu.test;
import java.security.SecureClassLoader;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtMethod;
import javassist.NotFoundException;
import ognl.Ognl;
import org.apache.log4j.Logger;
class DirectLoader extends SecureClassLoader {//类加载器,用于加载重复的类
protected DirectLoader() {
super(Test.class.getClassLoader());
}
@SuppressWarnings("rawtypes")
protected Class load(String name, byte[] data) {
return super.defineClass(name, data, 0, data.length);
}
}
class Employee {//实体
private String id;
private int age;
public int getAge() {
return age;
}
public String getId() {
return id;
}
public void setAge(int age) {
this.age = age;
}
public void setId(String id) {
this.id = id;
}
}
/**
* @author zhouxiang
* @version 1.0 2012-10-26 上午9:21:04
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger(Test.class);
/**
* @param args
*/
public static void main(String[] args) {
try {
// OGNL
Employee employee = new Employee();
employee.setId("hl9527");
employee.setAge(26);
LOGGER.info(Ognl.getValue("'id : ' + id + ' , age : '+age*10", employee));
// javassist
testS(" System.out.println(\"" + Test.class.toString() + "...............\");");
testS(" System.out.println(\"" + Test.class.toString() + ".......AAAAAA\");");
} catch (Exception e) {
LOGGER.error("异常", e);
}
}
public static void testS(String str) throws Exception {
String method = "display";
String classPath = "com.henglu.test.Test2";
String className = "TestTest";
ClassPool pool = ClassPool.getDefault();
CtClass ctclass;
CtMethod ctMethod;
try {
ctclass = pool.get(className);
ctclass.defrost();// 解冻,(类加载器加载后就会冻结)
ctMethod = ctclass.getDeclaredMethod(method);
ctMethod.setBody(str);
} catch (NotFoundException e) {
ctclass = pool.makeClass(className);// 创建类
ctclass.addInterface(pool.get(classPath));// 实现接口
CtConstructor cons = new CtConstructor(null, ctclass);// 实现构造方法
cons.setBody(";");
ctclass.addConstructor(cons);
ctMethod = new CtMethod(CtClass.voidType, method, null, ctclass);// 新建方法
ctMethod.setBody(str);
ctclass.addMethod(ctMethod);
}
DirectLoader directLoader = new DirectLoader();// 类加载器,用于重复加载名称相同的类
Test2 test2 = (Test2) directLoader.load(className, ctclass.toBytecode()).newInstance();
test2.display();
}
}
Test2接口
package com.henglu.test;
/**
* @author zhouxiang
* @version 1.0 2012-10-26 上午10:24:37
*/
public interface Test2 {
public void display();
}
输出结果
2012-10-26 15:43:54,369 [com.henglu.test.Test]-[INFO] id : hl9527 , age : 260
class com.henglu.test.Test...............
class com.henglu.test.Test.......AAAAAA
分享到:
相关推荐
添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...
基于groovy框架,进行的简单java动态代码执行;附件中包含java调用groovy具体的代码实现,及测试方法。
Java源代码,包含了所有以java开头的包
Java语言-动态编译代码并热加载类,js热加载
Java直接运行JS代码样例 java中调用js脚本 java中直接调用js代码
不需要任何java类文件,将字符串输入到内存,然后编译,加载,执行,整个过程全部在内存中实现,不会产生.java和.class文件,做到了洁净无污染。
java 动态编译.java文件,动态运行类 _1.3
Java五子棋算法和代码,新手java五子棋完整代码【完美运行】 用Java编写的五子棋,完美可以运行。对初学者很有参考价值 Java五子棋算法和代码,新手java五子棋完整代码
对javax.script包进行讲解,实现支持java动态嵌入执行groovy代码片段
有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。
Java程序是如何执行CMD命令的,就是需要RunTime、Process类而已。 具体代码在文档中
java android 执行脚本代码(java代码)
批处理执行java代码实例批处理执行java代码实例批处理执行java代码实例
JAVA实现抖音代码跳舞源码,直接可以运行的抖音跳舞视频,用java实现的!
1.codeFactory: Java代码生成,依赖rapid-generator.4.0.6.jar, 支持自定义模板生成代码, 弱业务下完全解放体力劳动. 2.ssm模板实现:pojo,dao,daoimpl,service,serviceimpl,controller,各mapper.xml 代码自动生成, 3....
Java执行JavaScript代码.pdf
java定时执行代码,感觉比较简单分享一下!!!
基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...
人机对战,自定义用户名,选择电脑角色,电脑随机出拳。结束后,公布结果。提示:这是一个Java包,解压后,直接粘贴到新建的工程里,然后运行GOthegame.java即可.如果出现错误,改下包名
NULL 博文链接:https://relive123-yahoo-com-cn.iteye.com/blog/784700