`
zhouxianglh
  • 浏览: 263882 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 动态执行代码

    博客分类:
  • J2SE
 
阅读更多

今天总结了一下.动态执行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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics