`
阿尔萨斯
  • 浏览: 4201024 次
社区版块
存档分类
最新评论

webx—动态创建class文件

 
阅读更多

在开发过程中,经常会遇到第三方jar包的类提供的服务不能满足我们的需要。这时我们通常的做法是定义一个子类,复写父类方法,用子类实例化对象,其引用类型不变。 这种方式的特点是:

1. 修改源文件,新定义java文件

2. 编译.java文件为.class文件

3. 由classLoader加载字节码文件到内存中,由解析器来执行


现存在这么一种场景,如taobao开放平台,界面上有很多的选项框,我们只要选择相应的接口、方法,输入分配给我们的帐号,然后在文本框中编写一段java调用代码,就可以在页面上看到返回结果。

此时需要在运行的情况下,动态编译字符串代码,在内存中生成新的class文件,后续步骤同上

目前有很多成熟的开源项目支持分析、编辑和创建Java字节码,如cglib、asm、javassist

本文以javassist为例子,通过一个简单例子来描述上面是如何实现。

Person.java

package com.alibaba.model;

/**
 * 类Person.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-6-17 下午04:19:49
 */
public class Person {

    private String name;
    private String age;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}
AssistFactory.java

package com.alibaba.factory;

import java.util.concurrent.atomic.AtomicInteger;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

import com.alibaba.model.Person;

/**
 * 类AssistFactory.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-6-17 下午04:20:46
 */
public class AssistFactory {

    // Class载入器
    private static ClassPool     pool;
    // 原子计数器
    private static AtomicInteger number = new AtomicInteger(1);
    static {
        pool = ClassPool.getDefault();
    }

    public void compileAndExe(String body) throws Exception {
        String name = Person.class.getName();
        // 新定义的子类,可以修改
        CtClass cc = pool.makeClass(name + "$" + number.incrementAndGet());
        // 父类
        cc.setSuperclass(pool.get(name));
        // 复写父类方法
        String method = "public String getName(){ System.out.println(super.getName()+\" is %s!\"); return super.getName(); }";
        
        method=String.format(method, body);
        // 将新方法添加到类中
        cc.addMethod(CtMethod.make(method, cc));

        // 类模板
        Class<?> c = cc.toClass();
        cc.detach();

        // 实例化对象
        Person p = (Person) c.newInstance();
        p.setName("onlyone");

        p.getName();
    }

    public static void main(String[] args) throws Exception {
        new AssistFactory().compileAndExe("sign");
    }
}
结果:

onlyone is sign!

代码下载地址:https://javassist.googlecode.com/svn/trunk/



分享到:
评论

相关推荐

    创建简单的WEBX应用

    webx框架(淘宝框架),webx+spring+ibatis

    Webx3.0小结

    webx3.0学习小结

    webx框架指南

    阿里开源框架webx的文档,想要学习webx或者维护webx的开发者可以下载

    webx2.7绿色安装

    WEBX是阿里巴巴的内部框架,“就是把页面与Service层之间的一些Servlet等公共的东西抽象出来,提供相应的服务以提高开发效率(《接口测试之Webx简介》—何晓峰 )”,可以看出,webx和传统的servlet-action模式的...

    webx

    NULL 博文链接:https://xj84.iteye.com/blog/1850955

    webx总结 项目实践总结

    webx3 启动顺序,webx使用总结,webx表单提交(感觉你还是看webx文档 貌似更加好哦!那个表单提交写的很是详细)

    Webx及框架简介

    Webx及框架简介 ppt 格式

    淘宝WEBX框架详解

    WEBX框架详解,更好的了解Taobao的开发过程,对于新手更容易上手。

    Webx3_Guide_Book.pdf 用户指南

    Webx3_Guide_Book 用户指南 2001年,阿里巴巴内部开始使用Java Servlet作为WEB服务器端的技术,以取代原先的 Apache HTTPD server和...Webx 2.0的代码,只需要修改配置文件就可完成升级。 • 2010年底,Webx 3.0开源。

    webx3文档——web开发

    该文档为官方webx框架文档,对webx进行了全面的讲解,非常实用。

    Webx介绍_PDF

    淘宝开源Web开发框架Webx3.0介绍,内附宠物店程序作为例子详细解说webx框架的方方面面。

    webx_guide

    快速使用 webx 开发web 应用 Webx框架指南 Michael Zhou

    阿里巴巴J2EE Webx框架简介

    阿里巴巴内部J2EE平台 Webx框架简介,现在是webx3.0,而且已经开源!

    项目中用到的webx

    1.webx是阿里巴巴开发的mvc框架(就是spring mvc又封了一层) 2.此项目是个完整的项目,修改数据库配置后可直接运行(搜索data-source.xml) ...3.此为maven项目,jar包在项目中会直接下载,因此此工程文件不大

    webx入门介绍

    webx框架是淘宝开发的比较流行的框架,这个是webx框架的入门介绍

    WebX入门指南示例程序

    WebX入门指南示例程序,通过结合博文:http://blog.csdn.net/fiboliu/article/details/50040273和代码讲解了,WebX入门级的使用指南!

    webx3学习的demo,以及留言板的小例子

    根据webx3的官方网站,www.openwebx.org,找到“创建一个webx应用”,按照上面说的流程,就可以创建一个webx的项目。具体流程这里就不说了,官网上已经写得很清楚了。

    通用WEB框架 Webx.zip

    通用WEB框架 Webx ,Webx是建立在Java Servlet API基础上的的通用WEB框架。用Webx搭建的应用可以...

    webx-springExt整合eclipse插件

    webx-springExt整合eclipse插件,挺好用的

Global site tag (gtag.js) - Google Analytics