redkale 技术详解 02 -欧洲杯足彩官网

`
redkale
  • 浏览: 9397 次
  • 性别:
  • 来自: 深圳
博主相关
  • 博客
  • 微博
  • 相册
  • 收藏
  • 社区版块
    • ( 2)
    • ( 1)
    • ( 0)
    存档分类

    redkale 技术详解 02 -- creator构建对象

    redkale 技术详解 02 -- creator构建对象

            org.redkale.util.creator是采用asm技术来实现代替反射构造函数的对象构建类。在根据流反序列化成对象、数据表记录转换成对象时都需要构建对象。常见的处理办法是利用反射,如gson框架中反序列化是通过反射进行对象创建。众所周知反射的性能是比较低的,所以redkale需要自实现一个对象构建类。

            creator是一个接口, 只有一个public t create(object... params)方法,可变参数既适合空参数的constructor也适合含参数的constructor。得利于java 8的新语法特性可以在接口上加上静态方法,creator对象可以通过creator.create(class clazz)方法创建。构建原理是通过constructor的参数来动态创建的。

    constructor<t> constructor0 = null;
    for (constructor c : clazz.getconstructors()) {  //优先找public 的构造函数
    if (c.getparametercount() == 0) {
            constructor0 = c;
            break;
        }
    }
    if (constructor0 == null) {//其次找非private带constructorproperties的构造函数
        for (constructor c : clazz.getdeclaredconstructors()) {
            if (modifier.isprivate(c.getmodifiers())) continue;
            if (c.getannotation(constructorproperties.class) != null) {
                constructor0 = c;
                break;
            }
        }
    }
    if (constructor0 == null) {//再次找非private且带-parameters编译项的构造函数 java 8以上才支持
        for (constructor c : clazz.getdeclaredconstructors()) {
            if (modifier.isprivate(c.getmodifiers())) continue;
            parameter[] params = c.getparameters();
            if (params.length == 0) continue;
            boolean flag = true;
            for (parameter param : params) {
                try {
                    clazz.getdeclaredfield(param.getname());
                } catch (exception e) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                constructor0 = c;
                break;
            }
        }
    }
    if (constructor0 == null) {//最后找非private的空构造函数
        for (constructor c : clazz.getdeclaredconstructors()) {
            if (modifier.isprivate(c.getmodifiers())) continue;
            if (c.getparametercount() == 0) {
                constructor0 = c;
                break;
            }
        }
    }

            从以上代码可以看出,根据优先级选择constructor,为了减少学习成本,creator直接重用了java.beans.constructorproperties注解,又因constructorproperties只能标记在constructor上,因此定义一个creator.constructorparameters注解,用于标记在creator的create方法上。

    public class record {
        private final int id;
        private string name;
        @constructorproperties({"id", "name"})
        record(int id, string name) {
            this.id = id;
            this.name = name;
        }
        public int getid() {
            return id;
        }
        public string getname() {
            return name;
        }
        public void setname(string name) {
            this.name = name;
        }
    }
    record.class通过asm自动构建与record同package的creator类如下:
    public final class record_dyncreator implements creator<record> {
        @override
        @creator.constructorparameters({"id", "name"})
        public record create(object... params) {
            if (params[0] == null) params[0] = 0;
            return new record((integer) params[0], (string) params[1]);
        }
    }

            如上代码,若构造参数是primitive类,而creator.create传入的参数可能是null,因此需要给null的primitive对象赋予默认值0。细心的人可能发现了record的构造函数并不是public的,虽然record_dyncreator与record在同一package,但由于两者不是同一个classloader,故不能直接new record。redkale曲线救国,通过urlclassloader的私有方法在record.class的classloader加载record_dyncreator。

    if (loader instanceof urlclassloader && !modifier.ispublic(constructor.getmodifiers())) {
        try {
            final urlclassloader urlloader = (urlclassloader) loader;
            final url url = new url("memclass", "localhost", -1, "/"  newdynname.replace('/', '.')  "/", 
                new urlstreamhandler() {
                @override
                protected urlconnection openconnection(url u) throws ioexception {
                    return new urlconnection(u) {
                        @override
                        public void connect() throws ioexception {
                        }
                        @override
                        public inputstream getinputstream() throws ioexception {
                            return new bytearrayinputstream(bytes);
                        }
                    };
                }
            });
            method addurlmethod = urlclassloader.class.getdeclaredmethod("addurl", url.class);
            addurlmethod.setaccessible(true);
            addurlmethod.invoke(urlloader, url);
            resultclazz = urlloader.loadclass(newdynname.replace('/', '.'));
        } catch (throwable t) { //异常无需理会, 使用下一种loader方式
            t.printstacktrace();
        }
    }

            如上代码,构建一个虚拟协议的url来实现加载,若record.class的classloader不是urlclassloader导致resultclazz为null则会抛出异常。

            creator是一个典型通过asm构建一个简单功能地动态类,同类型还有 、。

     

            转载请注明出处:

    4
    2
    分享到:
    评论

    相关推荐

      三国小小将-客户端-creator.zip源码cocos creator项目源码下载三国小小将-客户端-creator.zip源码cocos creator项目源码下载 1.上线产品适合个人学习技术做项目参考 2.开发脚本为javsscropt或者typescript 3.上线...

      cocos creator 3d开发入门----cocoscreator3d篮球.zip import { _decorator, component, node, rigidbodycomponent, physicmaterial, collidercomponent } from "cc"; const { ccclass, property } = _...

      altium designer logo创建脚本,解压后使用ad运行该脚本即可将灰度bmp图片转换为pcb log0.(ad17亲测可用)!

      方块鸟-精品-creator.zip源码cocos creator项目源码下载方块鸟-精品-creator.zip源码cocos creator项目源码下载 1.适合个人学习技术做项目参考 2.开发脚本为javsscropt或者typescript 3.适合小公司开发游戏项目参考

      原生win7系统不包含usb3.0的驱动,所以无法使用usb3.0的u盘在usb3.0的设备上引导,且安装完系统后还需要重新安装usb3.0驱动。...win7-usb3.0-creator-v3-win7admin.zip - 用于64位 windows7admin 系统安装

      win7-usb3.0-creator-v3-win7admin.7z

      cocos creator实例--使用creator简单实现连连看游戏 | 附代码。点击相同的两个动物图案,会消失一个选中框,然后就会消失掉

      d0_a1 qt-4.8.6 qtcreator-3.2.2 part2 配合mingw-w64使用,包含32位和64位版本

      台湾 今年嵌入式 课程课件,绝对技术紧跟国际 台湾嵌入式ptf文档和pptrm-033-04-101_creator-pxa270

      simple-bot-creator-源码.rar

      high-logic fontcreator官方版是一款高效实用的专业化字体设计辅助工具,high-logic fontcreator最新版功能强劲,能够帮助用户进行专业级的字体编辑操作,high-logic fontcreator软件界面美观,便捷好用,提供了相当...

      在win7安装u盘中加入usb3.0驱动的支持, intel usb 3.0驱动,win 7 安装iso是不支持usb 3.0

      欢乐球球-creator3d.zip源码cocos creator项目源码下载欢乐球球-creator3d.zip源码cocos creator项目源码下载 1.上线产品适合个人学习技术做项目参考 2.开发脚本为javsscropt或者typescript 3.上线产品适合小公司...

      linuxlive-usb-creator-rar

      qt-creator:编译版本是qt-creator-4.2.0 测试编译qt-creator-4.2.0 其他设备、系统、自行测试 ----------------------------------------------------------------------------- qt-creator-4.2.0,亲测可用 qt-...

      qt-creator:编译版本是qt-creator-4.0.3 测试编译qt-creator-4.0.3 其他设备、系统、自行测试 ----------------------------------------------------------------------------- qt-creator-4.0.3,亲测可用 qt-...

      资源来自pypi欧洲杯足彩官网。 资源全名:music-score-creator-0.9.1.tar.gz

      资源来自pypi欧洲杯足彩官网。 资源全名:lambda-project-creator-0.0.4.tar.gz

      编译版本是:qt-creator-4.8.2 测试编译qt-creator-4.8.2,亲测可用 其他设备、系统、自行测试 ----------------------------------------------------------------------- qt-creator-4.8.2,亲测可用 qt-creator-...

      react-redux-creator集成了react-router, react-redux, redux, redux-actions, redux-saga, seamless-immutable, connected-react-router, 简化了redux/异步处理和路由集成的配置工作,开箱即用使用redux常常需要...

    global site tag (gtag.js) - google analytics
    网站地图