今天总结了一下.动态执行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.创建任务并...
Java动态代码执行是一种在运行时编译和执行代码的技术,它可以极大地提高程序的灵活性和可扩展性。在Java中,Groovy是一个强大的脚本语言,它与Java语法兼容,并且可以无缝集成到Java应用程序中,使得动态代码执行变...
需要注意的是,JShell 适合快速测试简单的代码片段,而调试模式下的执行适合在运行时动态调试代码。javax.script包提供的接口执行方式则更加通用,适用于各种脚本语言的执行需求。在实施动态执行脚本时,还要确保...
Java动态生成代码并编译载入是一个高级的编程技术,主要用于那些需要在应用程序运行时根据某些模板和数据动态地生成、编译和加载Java代码的场景。这种技术在需要高度定制化处理或是运行时参数化生成业务逻辑的系统中...
Java动态生成代码并编译载入是Java编程中的一项高级技术,它允许程序在运行时创建新的类或接口,然后即时编译并加载到当前的Java虚拟机(JVM)中。这种技术主要依赖于Java的反射API和Java的编译器API(javac)或者更...
在Java编程环境中,有时我们需要与JavaScript交互,例如执行一些动态脚本或者利用JavaScript库的功能。Java提供了这样的能力,让我们可以直接在Java程序中运行JS代码。这主要得益于Oracle公司在Java 6版本引入的一个...
然而,有时候我们可能需要在Java程序中执行JavaScript代码,这通常是出于跨语言交互或者利用JavaScript的某些特性来增强Java应用的功能。这篇博客(博文链接已提供)将介绍如何在Java中执行JavaScript代码,这主要...
总的来说,Java的动态编译功能提供了极大的灵活性,使得开发者能够在运行时创建、编译和执行新的代码。这不仅可以提高开发效率,还能适应不断变化的业务需求。通过熟练掌握`JavaCompiler` API和`ClassLoader`的使用...
【标题】"java记事本 源代码"所涉及的知识点主要集中在Java编程语言、图形用户界面(GUI)设计以及文件操作上。这个项目利用Java的Swing库来构建一个类似于Windows记事本的应用程序,它实现了文本编辑的基础功能。 ...
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
至于压缩包内的文件“C++ to Java Converter.exe”很可能就是这个转换工具的执行程序,用户可以通过运行这个程序来转换C++代码。而“1.txt”可能是工具的使用指南、示例代码或转换后的Java代码。 在实际使用这种...
Java实时运行环境插件是Java应用程序的一个关键组成部分,主要用于在Internet Explorer浏览器中运行Applet小程序。Applet是一种基于Java的小型应用程序,它可以在用户的Web浏览器中执行,为用户提供丰富的交互体验。...
在Java编程环境中,有时我们需要在程序运行时动态地编译.java源代码文件并执行新生成的类。这种功能在处理代码生成、插件系统或测试自动化等场景中非常有用。本篇文章将深入探讨如何实现Java的动态编译与运行。 1. ...
11. **反射**:Java的反射机制允许在运行时动态地获取类的信息(如类名、方法名)并调用方法,增加了程序的灵活性。 12. **模块系统(Module System)**:Java 9引入的模块系统有助于大型项目的组织和管理,提高...
1. **Jython**: Jython是一种Python的实现,它运行在Java平台上,可以直接执行Python代码。通过Jython,Java可以像调用Java类一样调用Python模块。不过,Jython并不支持所有Python库,尤其是C扩展的库。 2. **...
标题和描述中提到的“Java执行JavaScript代码”指向了一个特定的技术范畴,即在Java环境中执行JavaScript代码。这通常涉及到使用Java中的脚本引擎API,特别是那些支持JavaScript的实现。从提供的部分内容中可以提炼...
Java2Pas.exe很可能是这个工具的可执行文件,用户可以通过运行它来启动代码转换过程。而Java2Pas.bat可能是一个批处理文件,用于自动化执行程序,例如设置特定的命令行参数或环境变量,以便于用户更方便地使用该工具...
Java动态编译是一种技术,允许程序在运行时将源代码转换为字节码并加载到JVM(Java虚拟机)中。这种能力使得Java应用程序能够根据需要编译和执行新的代码,增强了软件的灵活性和可扩展性。在给定的场景中,用户通过...
Java动态编译执行代码示例主要介绍了通过JavaCompiler实现java代码动态编译的过程。JavaCompiler是JDK提供的一个工具,用于实现java代码的动态编译。 第一步:获取JavaCompiler 在实现java代码动态编译之前,需要...
批处理执行Java代码是一种在没有用户交互的情况下自动化运行Java程序的方法。这通常涉及到创建一个批处理脚本(在Windows系统中是`.bat`文件,在Unix或Linux系统中是`.sh`文件),然后在这个脚本中调用Java命令来...