`
redkale
  • 浏览: 9893 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

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构建一个简单功能地动态类,同类型还有 org.redkale.util.Attributeorg.redkale.util.Reproduce

 

        转载请注明出处:http://redkale.org/article_creator.html

4
2
分享到:
评论

相关推荐

    三国小小将-客户端-creator.zip源码cocos creator项目源码下载

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

    High-Logic FontCreator

    《High-Logic FontCreator——创建与调整字体的艺术》 在数字化时代,个性化和创新成为设计领域的主流趋势,其中字体设计尤为重要。今天我们将深入探讨一款强大的字体编辑工具——High-Logic FontCreator,它允许...

    Win7-USB3.0-Creator-V3和Win7-USB3.0-Creator-V3-Win7Admin

    原生Win7系统不包含USB3.0的驱动,所以无法使用USB3.0的U盘在USB3.0的设备上引导,且安装完系统后还需要重新安装USB3.0驱动。...Win7-USB3.0-creator-V3-Win7admin.zip - 用于64位 Windows7admin 系统安装

    cocos creator实例--使用creator简单实现连连看游戏 | 附代码LLK.zip

    在本实例中,我们将探讨如何使用Cocos Creator构建一个简单的连连看游戏。 连连看游戏的基本玩法是找到并消除一对相同的图案,当所有图案配对成功后,游戏胜利。以下是实现这个游戏的关键步骤和涉及的技术点: 1. ...

    PyPI 官网下载 | lambda-project-creator-0.0.4.tar.gz

    标题中的"PyPI 官网下载 | lambda-project-creator-0.0.4.tar.gz"表明这是一个在Python Package Index(PyPI)上发布的项目,名为`lambda-project-creator`,版本为0.0.4,且已打包成tar.gz格式。PyPI是Python社区...

    方块鸟-精品-creator.zip源码cocos creator项目源码下载

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

    Cocos Creator 3D开发入门----CocosCreator3D篮球.zip

    Cocos Creator 3D开发入门----CocosCreator3D篮球.zip import { _decorator, Component, Node, RigidBodyComponent, PhysicMaterial, ColliderComponent } from "cc"; const { ccclass, property } = _...

    Win7-USB3.0-Creator-V3-Win7Admin.zip

    标题“Win7-USB3.0-Creator-V3-Win7Admin.zip”表明这是一个用于创建Windows 7 USB启动盘的工具,特别强调了它包含了USB 3.0的驱动支持。在描述中提到,通常标准的Windows 7安装ISO文件并不包含USB 3.0的驱动,这会...

    Win7-USB3.0-Creator-V3-Win7Admin.7z

    为了解决这一困扰,出现了专门的工具——"Win7-USB3.0-Creator-V3-Win7Admin",它是一个专为Windows 7设计的USB 3.0驱动安装创建器,旨在充分利用USB 3.0的高速传输优势,使系统安装过程更为流畅。 USB 3.0是一种...

    Kylin-4.0.2-desktop-sp2-arm64 编译完成qt-creator-4.2.0

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

    D0_A1_qt-4.8.6-qtcreator-3.2.2-part2

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

    RM-033-04-101_Creator-PXA270_Creator-PXA270-Experiment-Environment-Overview

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

    PyPI 官网下载 | music-score-creator-0.9.1.tar.gz

    这个特定的资源名为"music-score-creator-0.9.1.tar.gz",它是一个经过打包的源代码压缩文件,通常包含该库的所有源码、元数据以及可能的依赖信息。 音乐分数生成器库允许程序员创建和处理音乐乐谱。它可能是用于...

    High_Logic_FontCreator_13.0.0.2683.rar

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

    skin-pack-creator:用于创建Minecraft皮肤包的客户端网页

    "skin-pack-creator"作为一个客户端网页应用,展示了Web开发的多种技术。除了JavaScript,还包括HTML和CSS,它们共同构建了用户界面。HTML负责页面结构,CSS负责样式设计,使得界面美观且易用。此外,可能还涉及到...

    Kylin-V10-GFB-020-desktop-arm64 编译完成qt-creator-4.8.2

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

    夜幕降临-cocoscreator-源码.zip源码cocos creator项目源码下载

    夜幕降临-cocoscreator-源码.zip源码cocos creator项目源码下载夜幕降临-cocoscreator-源码.zip源码cocos creator项目源码下载 1.上线产品适合个人学习技术做项目参考 2.开发脚本为javsScropt或者typeScript 3.上线...

    Simple-Bot-Creator-源码.rar

    【标题】"Simple-Bot-Creator-源码.rar" 提供的是一个简单的机器人创建器的源代码,这通常是一个用于教学或快速构建自动化脚本工具的项目。源代码是编程人员编写程序的原始文本,它包含了所有必要的指令,用于解释...

    qt-creator-2.8.0-rc-src.tar.gz

    1. **解压源码**:使用`tar`命令解压qt-creator-2.8.0-rc-src.tar.gz文件到指定目录,例如`/opt/source`: ``` tar -xzf qt-creator-2.8.0-rc-src.tar.gz -C /opt/source ``` 2. **配置环境**:确保系统已安装...

    Kylin-4.0.2-desktop-sp2-arm64 编译完成qt-creator-4.0.3

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

Global site tag (gtag.js) - Google Analytics